2017-07-13 3 views
1

Je travaille sur un script Inno Setup et pendant la désinstallation, j'appelle une DLL personnalisée pour effectuer une opération de Revert. Malheureusement, une fois la désinstallation terminée, la DLL et ses dépendances n'ont pas été supprimées, malgré le fait que j'ai appelé UnloadDLL et DeleteFile. Pourquoi UnloadDLL échoue-t-il? Est-il possible de charger la DLL dynamique avec LoadLibrary? J'ai vu quelques fonctions à ce sujet, mais ils sont tous dépréciés.Inno Setup: UnloadDLL ne fonctionne pas lors de la désinstallation

Voici le code:

function Revert(param: String): cardinal; 
external '[email protected]{app}\Revert.dll cdecl delayload uninstallonly'; 

procedure RevertAll(); 
var 
    param: String; 
    dataDirectory: String; 
    temp: String; 
    i: Integer; 
begin 
    dataDirectory := ExpandConstant('{commonappdata}\MyAppData'); 
    StringChangeEx(dataDirectory, '\', '\\', True); 
    param := '{"dataDirectory": "' + dataDirectory + '", "registryPath" : "SOFTWARE\\MyReg\\Key"}'; 

    Revert(param); 

    temp := ExpandConstant('{app}\Revert.dll'); 
    for i := 0 to 10 do 
    begin 
     UnloadDLL(temp); 
     Sleep(500); 

     if DeleteFile(temp) then 
      break; 
end; 

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
begin 
    if (CurUninstallStep = usUninstall) then 
    begin 
     RevertAll(); 
    end 
end; 
+0

Que signifie 'DeleteFile' retour? –

+0

Renvoie false. – dJonzo

+0

Juste une note de côté: 'StringChangeEx (dataDirectory, '\', '\\', True);' est un peu dangereux. Si "\\" est déjà présent dans 'dataDirectory', le résultat sera" \\\\ "! –

Répondre

1

Je ne sais pas ce qui est le vrai problème, mais déchargent la DLL manuellement avec Windows API fonctionne:

function GetModuleHandle(moduleName: String): LongWord; 
external '[email protected] stdcall'; 

function FreeLibrary(module: LongWord): Integer; 
external '[email protected] stdcall'; 

var 
    lib: LongWord; 
    res: integer; 

repeat 
    lib := GetModuleHandle('Revert.dll'); 
    res := FreeLibrary(lib); 
until res = 0;