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