Le chargement d'une DLL avec des dépendances dans Inno Setup échoue dans le programme de désinstallation avec «Impossible d'importer la DLL», mais fonctionne dans le programme d'installation

Nov 26 2020

Lorsque je désinstalle le programme, j'obtiens cette erreur:

Impossible d'importer la DLL: <utf8> c: \ TestProg \ IsStart.dll

Qu'ai-je fait de mal ici? Quelqu'un peut-il m'aider à résoudre ce problème?

CheckO4TaskMngrSvcStopAndUninstallarrête et supprime O4TaskManager Service:

Voici le code:

[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;

Réponses

1 MartinPrikryl Nov 30 2020 at 16:54

Je crois qu'il y avait une série de problèmes différents (dont certains étaient en effet basés sur mes fausses suggestions).

Le code correct est, 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';

Les points clés:

  • Votre problème initial était l'absence d' loadwithalteredsearchpathindicateur dans la déclaration d'importation pour le programme de désinstallation. Vous en avez besoin pour charger les dépendances ( sqlite3.dll).
  • Vous devez installer les dépendances ( sqlite3.dll) sur le {app}pour l'utilisation par le programme de désinstallation.
  • La copie installée de la dépendance doit correspondre au nom recherché par la DLL principale ( sqlite3.dllet non sqlite3x86.dll).
  • Le nom des DLL dans la externaldéclaration doit correspondre au nom du fichier de destination ( DestName: IsStart.dll, DestName: sqlite3.dll), pas à celui d'origine.
  • La dépendance doit et peut être répertoriée dans la déclaration uniquement lors du chargement des DLL depuis le programme d'installation (avec le files:préfixe). Pas lors du chargement de la DLL à partir d'un chemin physique ( {app}\IsStart.dll). Le seul but de la liste de la dépendance est que l'installateur l'extrait (il ne la charge pas, la DLL principale le fait, d'où le point précédent). Vous n'avez pas besoin de le répertorier lors du chargement de fichiers physiques, car tous les fichiers sont (doivent être) déjà installés. Si vous utilisez {app}\primary.dll,{app}\dependency.dll, le programme de désinstallation essaiera en fait de charger un fichier avec un nom {app}\primary.dll,{app}\dependency.dll- échouant évidemment.
  • Il ne sert à rien d'installer quoi que ce soit sur {tmp}ni {src}.
АндрейА Nov 29 2020 at 06:06

IsStart.dll dépend de sqlite3.dll? Peut-être ne sait-il pas ce qu'est sqlite3x86.dll. Dans totalcmd avec un plugin, vous pouvez voir les dll manquées