Da kernel32.dll in deinen Anwendungen eh immer bereits geladen sein wird, brauchst du ssie nicht nochmals zu laden/freizugeben ^^
FreeLibrary(hHandle); entfällt und
hHandle := LoadLibrary('kernel32.dll'); wird durch
hHandle := GetModuleHandle('kernel32.dll'); ersetzt.
Dein IsWin64 kannst du eigentlich auch weglassen, denn du fühst die Anwendung ja so oder so aus, selbst wenn Wow64DisableWow64FsRedirection nicht funkioniert.
Außerdem wird Wow64DisableWow64FsRedirection eh nur unter Win64 laufen.
Also kann man auch durch Aufrufen 'ner Win64-Funktion gleich mit auf Win64 testen.
Hier mal eine Kurzfassung deines Codes, wobei hier bei einem fehlgeschalgenem Aufruf mit Wow64FsRedirection nochmal es nochmals ohne versucht wird.
Delphi-Quellcode:
Function FileExec(Const sDatei, sParam: String; iShowCmd: Integer = sw_ShowNormal): Integer;
Type TWow64DisableWow64FsRedirection = Function(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
TWow64EnableWow64FsRedirection = Function(Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
Var hHandle: THandle;
Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection;
Wow64FsEnableRedirection: LongBool;
Begin
hHandle := GetModuleHandle('kernel32.dll');
@Wow64EnableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64EnableWow64FsRedirection');
@Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');
If (hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil)
and (@Wow64DisableWow64FsRedirection <> nil) Then
Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
Result := ShellExecute(0, nil, PChar(sDatei), PChar(sParam), nil, iShowCmd);
Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
End Else Result := 0;
Result := Result or ShellExecute(0, nil, PChar(sDatei), PChar(sParam), nil, iShowCmd);
End;