Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#1

ShellExecuteEx mit Verb properties und x64

  Alt 13. Dez 2014, 14:32
Hallo Leute ,

ich muss mir mal wieder externen Input von euch holen, da ich auf ein Phänomen gestoßen bin und sich mir die Frage nach der "richtigen" Lösung stellt.

Es geht hierbei nur um Windows x64 (egal ob XP oder 7 oder höher).

Simple Testapplikation:
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses ShellAPI, MyLibrary;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var SEI: TShellExecuteInfo;
begin
    FillChar(SEI, SizeOf(SEI), 0); // Wipe the record to start with
    SEI.cbSize:= SizeOf(SEI);
    if Checkbox2.Checked then
        SEI.fMask:= SEE_MASK_NOCLOSEPROCESS
    else begin
        SEI.fMask:= SEE_MASK_INVOKEIDLIST;
        SEI.lpVerb:= 'properties';
    end;
    SEI.Wnd:= Self.Handle;
    SEI.lpFile:= PChar(Edit1.Text);
    SEI.nShow:= SW_SHOWNORMAL;
    {$IFDEF WIN32}
    if (Checkbox1.Checked) then
        SwitchX64Redirection(True);
    {$ENDIF}
    ShellExecuteEx(@SEI);
    {$IFDEF WIN32}
    if (Checkbox1.Checked) then
        SwitchX64Redirection(False);
    {$ENDIF}
end;

end.
In dem Edit1 steht beispielsweise "C:\Windows\system32\msiexec.exe". Egal, ob die Checkbox angehakt ist oder nicht, es kommt immer der Eigenschaften-Dialog der Datei "%SystemRoot%\syswow64\msiexec.exe". Wenn ich die Datei starte (Verb open) statt dessen Eigenschaften anzuzeigen, wird je nach Haken die richtige Datei ausgeführt (sichtbar im Taskmanager) - bei deaktivierter Redirection (Checkbox aktiviert) %SystemRoot%\system32\msiexec.exe und bei aktivierter Redirection (Checkbox deaktiviert) ist es %SystemRoot%\syswow64\msiexec.exe. "Nette" Sache bis hierhin - eher lästig, aber egal.

Nun, wie bekomme ich jetzt den Eigenschaften-Dialog der richtigen Datei? Da es keine Funktion GetNativeSystemDirectory o.ä. gibt, kam mir bisher nur der Gedanke, GetWindowsDirectory zu rufen und "\Sysnative" anzuhängen und dann mit StringReplace "%SystemRoot%\system32" zu ersetzen. Gibt's da nicht was besseres?

MfG Dalai

Geändert von Dalai (13. Dez 2014 um 16:06 Uhr)
  Mit Zitat antworten Zitat