Einzelnen Beitrag anzeigen

Benutzerbild von Rakshasa
Rakshasa

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

Re: Datei ausführen unter Windows 64-Bit

  Alt 20. Feb 2007, 12:49
So, jetzt bin ich weniger verwirrt. Habe meine VMWare zum Laufen bekommen und konnte das Ganze auf Win32 (XP, SP2) testen. Dabei trat bei mir der Fehler auf, dass schon die Functionen der kernel32.dll einen Fehler beim Starten des Programms verursacht haben, da diese bei WIn32 fehlen. Auch hat die "0" bei ShellExecute (letzt Parameter) dazu geführt, das RegEdit unsichtbar startet - dies war bei Win64 (Vista) komischerweise nicht der Fall, anscheinend dürften hier Applikatione nicht mehr unsichtbar sein oder so.

Fazit: Habe das Ganze also dynamisch eingebunden und dabei ist folgende Function() herausgekommen; bei mir funktionierte alles unter Win XP32 und Vista 64-Bit tadellos.

Delphi-Quellcode:

uses ShellApi, Windows, Registry;

....

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
  Wow64FsEnableRedirection: LongBool;

Function IsWin64: Boolean;
begin
  With TRegistry.Create do begin
   RootKey := HKEY_LOCAL_MACHINE;
   Result := KeyExists('\SOFTWARE\Wow6432Node');
   Free;
  end;
end;

var
  hHandle: THandle; // Handle zur DLL
  Wow64DisableWow64FsRedirection: TWow64DisableWow64FsRedirection;
  Wow64EnableWow64FsRedirection: TWow64EnableWow64FsRedirection;
begin

if isWin64 then begin // Win64

 hHandle := LoadLibrary(PChar('kernel32.dll'));
  if hHandle <> 0 then begin
    @Wow64EnableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64EnableWow64FsRedirection');
    @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');

    if (@Wow64EnableWow64FsRedirection <> nil) AND (@Wow64DisableWow64FsRedirection <> nil) then begin // Alles OK? Dann Datei ausführen!
      Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection);
      Result := ShellExecute(0, nil, PChar(sdatei), Pchar(sParam), nil, iShowCmd);
      Wow64EnableWow64FsRedirection(Wow64FsEnableRedirection);
    end;

    FreeLibrary(hHandle);
  end;

end else begin // Normales Win32
 Result := ShellExecute(0, nil, PChar(sdatei), Pchar(sParam), nil, iShowCmd);
end;


end;
Der Aufruf erfolgt dann über:

 Fileexec('C:\Windows\regedit.exe', ''); Vielleicht kann's ja jemand anders nochmals testen und ggf. Optimierungsmöglichkeiten posten.
  Mit Zitat antworten Zitat