La carga de DLL con dependencias en Inno Setup falla en el desinstalador con "No se puede importar DLL", pero funciona en el instalador
Nov 26 2020
Cuando desinstalo el programa, aparece este error:
No se puede importar dll: <utf8> c: \ TestProg \ IsStart.dll
¿Qué he hecho mal aquí? ¿Alguien puede ayudarme a resolver este problema?
CheckO4TaskMngrSvcStopAndUninstall
detiene y elimina O4TaskManager Service
:
Aquí está el código:
[Files]
Source: "IsStartServer.dll"; DestDir: "{tmp}"; DestName: IsStart.dll
Source: "IsStartServer.dll"; DestDir: "{app}"; DestName: IsStart.dll
Source: "sqlite3x86.dll"; DestDir: "{src}"; DestName: sqlite3.dll
Source: "sqlite3x86.dll"; DestDir: "{app}"; DestName: sqlite3.dll
Source: "sqlite3x64.dll"; DestDir: "{app}"
[Code]
function TaskMngrInst: LongBool;
external 'CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';
function TaskMngrUninst: LongBool;
external 'CheckO4TaskMngrSvcStopAndUninstall@{app}\IsStart.dll stdcall uninstallonly';
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
TaskMngrInst();
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
TaskMngrUninst();
DeleteFile(ExpandConstant('{app}\sqlite3.dll'));
DeleteFile(ExpandConstant('{app}\IsStart.dll'));
RenameFile('{app}\sqlite3x64.dll)', '{app}\sqlite3.dll');
end;
end;
Respuestas
1 MartinPrikryl Nov 30 2020 at 16:54
Creo que hubo una serie de problemas diferentes (algunos de los cuales de hecho se basaron en mis sugerencias incorrectas).
El código correcto es, imo:
[Files]
Source: "IsStartServer.dll"; DestDir: "{app}"; DestName: IsStart.dll
Source: "sqlite3x86.dll"; DestDir: "{app}"; DestName: sqlite3.dll
[Code]
function TaskMngrInst: LongBool;
external 'CheckO4TaskMngrSvcStopAndUninstall@files:IsStart.dll,sqlite3.dll stdcall loadwithalteredsearchpath setuponly';
function TaskMngrUninst: LongBool;
external 'CheckO4TaskMngrSvcStopAndUninstall@{app}\IsStart.dll stdcall loadwithalteredsearchpath uninstallonly';
Los puntos clave:
- Su problema original era la falta de una loadwithalteredsearchpathbandera en la declaración de importación del desinstalador. Lo necesitas para cargar las dependencias (
sqlite3.dll
). - Debe instalar las dependencias (
sqlite3.dll
){app}
para que las use el desinstalador. - La copia instalada de la dependencia debe coincidir con el nombre que busca la DLL principal (
sqlite3.dll
, nosqlite3x86.dll
). - El nombre de las DLL en la
external
declaración debe coincidir con el nombre del archivo de destino (DestName: IsStart.dll
,DestName: sqlite3.dll
), no con el original. - La dependencia debe y puede aparecer en la declaración solo cuando se cargan las DLL desde el instalador (con el
files:
prefijo). No cuando se carga la DLL desde una ruta física ({app}\IsStart.dll
). El único propósito de enumerar la dependencia es que el instalador la extraiga (no la carga, la DLL principal sí, de ahí el punto anterior). No es necesario que lo incluya en la lista al cargar archivos físicos, ya que todos los archivos ya están (deben estar) instalados. Si lo usa{app}\primary.dll,{app}\dependency.dll
, el desinstalador intentará cargar un archivo con un nombre{app}\primary.dll,{app}\dependency.dll
, obviamente fallando. - No tiene sentido instalar nada en
{tmp}
ni{src}
.
АндрейА Nov 29 2020 at 06:06
IsStart.dll depende de sqlite3.dll? Puede que no sepa qué es sqlite3x86.dll. En totalcmd con algún complemento, puede ver la dll perdida