Einzelnen Beitrag anzeigen

Benutzerbild von Rakshasa
Rakshasa

Registriert seit: 1. Nov 2003
182 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Datei ausführen unter Windows 64-Bit

  Alt 2. Apr 2007, 13:25
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ß!
  Mit Zitat antworten Zitat