Wie ich jetzt endlich mal herausgefunden habe, führt der bisherherige Code dazu, dass (zumindest unter Vista 64-Bit) ein extrem seltsamer Fehler auftritt: Dialoge (showmessage(), showtaskmessage(), TaskDialog() etc.) werden teilweise einfach nicht angezeigt. Es tritt allerdings keine
Exception auf o.ä., der Code des Dialogs wird einfach "übersprungen"; der Fehler ist auch nicht immer direkt reproduzierbar, sonder tritt teilweise sporadisch auf.
Lösung:
Ein winziger Fehler im Code, nämlich ein fehlendes "var"...
Hier jetzt ein Code, der zumindest bei mir funktioniert, benötigt wird evtl. noch eine Function, die true oder false zurückgibt, sofern ein Win64-Betriebssystem vorliegt: Is64Bit().
Code:
Function ChangeFSRedirection(bDisable: Boolean): Boolean;
Type TWow64DisableWow64FsRedirection = Function(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
TWow64EnableWow64FsRedirection = Function(var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
Var
hHandle: THandle;
Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection;
Wow64FsEnableRedirection: LongBool;
begin
Result := true;
if not Is64Bit then exit; // Kein 64-Bit-Win?
try
hHandle := GetModuleHandle('kernel32.dll');
@Wow64EnableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64EnableWow64FsRedirection');
@Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');
if bDisAble then begin
If ((hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) and (@Wow64DisableWow64FsRedirection <> nil)) Then
Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
end;
if not bDisAble then
If ((hHandle <> 0) and (@Wow64EnableWow64FsRedirection <> nil) and (@Wow64DisableWow64FsRedirection <> nil)) Then
Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
Except Result := false;
end;
end;
Die Anwendung kann dann z.B. so erfolgen:
Code:
ChangeFSRedirection(true);
OpenFile('C:\Windows\system32\einedatei.txt');
ChangeFSRedirection(false);
Viel Spaß!