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?

CheckO4TaskMngrSvcStopAndUninstallstoppt 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.dllnicht sqlite3x86.dll).
  • Der Name der DLLs in der externalDeklaration 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.dllversucht 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