Das Laden der DLL mit Abhängigkeiten in Inno Setup schlägt im Deinstallationsprogramm mit "DLL kann nicht importiert werden" fehl, funktioniert jedoch im Installationsprogramm
Nov 26 2020
Wenn ich das Programm deinstalliere, wird folgende Fehlermeldung angezeigt:
DLL kann nicht importiert werden: <utf8> c: \ TestProg \ IsStart.dll
Was habe ich hier falsch gemacht? Kann mir jemand helfen, dieses Problem zu lösen?
CheckO4TaskMngrSvcStopAndUninstall
stoppt und löscht O4TaskManager Service
:
Hier ist der 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;
Antworten
1 MartinPrikryl Nov 30 2020 at 16:54
Ich glaube, es gab eine Reihe verschiedener Probleme (von denen einige tatsächlich auf meinen falschen Vorschlägen beruhten).
Der richtige Code lautet 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';
Die wichtigsten Punkte:
- Ihr ursprüngliches Problem war das Fehlen eines loadwithalteredsearchpathFlags in der Importdeklaration für das Deinstallationsprogramm. Sie benötigen es, um die Abhängigkeiten zu laden (
sqlite3.dll
). - Sie müssen die Abhängigkeiten (
sqlite3.dll
){app}
für die Verwendung durch das Deinstallationsprogramm auf installieren . - Die installierte Kopie der Abhängigkeit muss mit dem Namen übereinstimmen, nach dem die primäre DLL sucht (
sqlite3.dll
nichtsqlite3x86.dll
). - Der Name der DLLs in der
external
Deklaration muss mit dem Zieldateinamen (DestName: IsStart.dll
,DestName: sqlite3.dll
) übereinstimmen , nicht mit dem ursprünglichen. - Die Abhängigkeit muss und kann nur beim Laden der DLLs aus dem Installationsprogramm (mit dem
files:
Präfix) in der Deklaration aufgeführt werden . Nicht beim Laden der DLL von einem physischen Pfad ({app}\IsStart.dll
). Der einzige Zweck für die Auflistung der Abhängigkeit besteht darin, dass das Installationsprogramm sie extrahiert (es wird nicht geladen, die primäre DLL jedoch, daher der vorherige Punkt). Sie müssen es beim Laden physischer Dateien nicht auflisten, da alle Dateien bereits installiert sind (müssen). Wenn Sie verwenden,{app}\primary.dll,{app}\dependency.dll
versucht das Deinstallationsprogramm tatsächlich, eine Datei mit einem Namen zu laden{app}\primary.dll,{app}\dependency.dll
- was offensichtlich fehlschlägt. - Es gibt keinen Punkt der Installation nichts zu
{tmp}
noch{src}
.
АндрейА Nov 29 2020 at 06:06
IsStart.dll hängt von sqlite3.dll ab? Vielleicht weiß es nicht, was sqlite3x86.dll ist. In totalcmd mit einigen Plugins können Sie verpasste DLL anzeigen