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?

CheckO4TaskMngrSvcStopAndUninstalldetiene 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, no sqlite3x86.dll).
  • El nombre de las DLL en la externaldeclaració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