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?
CheckO4TaskMngrSvcStopAndUninstall
arrê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.dll
et nonsqlite3x86.dll
). - Le nom des DLL dans la
external
dé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