AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi ShellExecuteEx mit Verb properties und x64
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecuteEx mit Verb properties und x64

Ein Thema von Dalai · begonnen am 13. Dez 2014 · letzter Beitrag vom 15. Dez 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Dalai
Dalai

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

ShellExecuteEx mit Verb properties und x64

  Alt 13. Dez 2014, 13: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 15:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#2

AW: ShellExecuteEx mit Verb properties und x64

  Alt 13. Dez 2014, 13:53
Das ist die Abwärtskompatibilitätsvirtualisierung vom Windows.
Genauso, wie das UAC deine Schreibzugriffe in den VirtualStore umleitet, wenn ein schrottiges Programm versucht in C:\Programme oder C:\Windows zu schreiben,

werden 32-Bit-Programme in einem 64-Bit-Windows auf die 64-Bit-Pfade umgeleitet. Und das nur weil mal dachte es wäre doch sooooo viel Besser wegen schrottiger 64 Bit-Programme die alten Pfade so belassen.
Genauso wie in neueren Delphis die Unicode-String-Funktionen alle noch ANSI heißen.

MSDN-Library durchsuchenWow64DisableWow64FsRedirection
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#3

AW: ShellExecuteEx mit Verb properties und x64

  Alt 13. Dez 2014, 14:00
Ich kenne die Funktionen Wow64*. Und wenn du richtig schaust, siehst du, dass genau die benutzt werden, aber für das Verb properties nutzlos sind (eigentlich logisch, denn es finden keine Dateisystemzugriffe statt).

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#4

AW: ShellExecuteEx mit Verb properties und x64

  Alt 13. Dez 2014, 14:10
Nö.

Da gibt es nur ein SwitchX64Redirection und ich weiß ja nicht was das macht und ob es z.B. auch die Rückgabewerte auswertet.


Du könntest auch mal versuchen dein Programm als Kompatibel zur Windows-Version auszuweisen.
Viele Abwärtskopatibilitätsdinge sind nur aktiv, wenn das Programm als "alt" angesehn wird.

Hier im Forum suchenManifestCreator -> unterstütztes BS
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Dez 2014 um 14:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#5

AW: ShellExecuteEx mit Verb properties und x64

  Alt 13. Dez 2014, 14:27
[del]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#6

AW: ShellExecuteEx mit Verb properties und x64

  Alt 13. Dez 2014, 15:06
Nö.

Da gibt es nur ein SwitchX64Redirection und ich weiß ja nicht was das macht und ob es z.B. auch die Rückgabewerte auswertet.
Also mal ernsthaft: Ich schrieb, dass ein Starten der EXE mit ShellExecuteEx funktioniert (also die richtige EXE ausführt), aber das Öffnen/Anzeigen der Eigenschaften das nicht tut. Wo glaubst du nun, wäre ein Fehler? Die Funktion SwitchX64Redirection tut genau das, was sie soll, auch beim Auslesen von Dateieigenschaften mit FindFirst & Co (Größe, Datum etc). Probier's selbst aus (hab den Code im OP mal etwas erweitert, damit sich das einfacher testen lässt). Aber der Vollständigkeit halber:
Delphi-Quellcode:
var OldWow64RedirectionValue : LongBool;
{$IFDEF WIN32}
function SwitchX64Redirection(bDisable: Boolean): Boolean;

 type TWow64DisableWow64FsRedirection = Function(var Wow64FsEnableRedirection: LongBool): LongBool; StdCall;
      TWow64RevertWow64FsRedirection = Function(OldValue: LongBool): LongBool; StdCall;

  var
    hHandle : THandle;
    Wow64DisableWow64FsRedirection : TWow64DisableWow64FsRedirection;
    Wow64RevertWow64FsRedirection : TWow64RevertWow64FsRedirection;

begin
    Result:= true;
    try
        hHandle:= GetModuleHandle(KERNEL32);
        @Wow64DisableWow64FsRedirection := GetProcAddress(hHandle, 'Wow64DisableWow64FsRedirection');
        @Wow64RevertWow64FsRedirection := GetProcAddress(hHandle, 'Wow64RevertWow64FsRedirection');

        if bDisable then
        begin
            if ((hHandle <> 0) AND
               (@Wow64DisableWow64FsRedirection <> nil)) then
                   if NOT Wow64DisableWow64FsRedirection(OldWow64RedirectionValue) then
                       RaiseLastOsError;
        end
        else
        begin
            if ((hHandle <> 0) AND
               (@Wow64RevertWow64FsRedirection <> nil)) then
                   if NOT Wow64RevertWow64FsRedirection(OldWow64RedirectionValue) then
                       RaiseLastOsError;
        end;
    except
        Result:= false;
        raise;
    end;
end;
{$ENDIF WIN32}
Zitat:
Du könntest auch mal versuchen dein Programm als Kompatibel zur Windows-Version auszuweisen.
Viele Abwärtskopatibilitätsdinge sind nur aktiv, wenn das Programm als "alt" angesehn wird.
Spielt keine Rolle, weil ich das im eigentlichen Programm eh nicht beeinflussen kann, weil es eine DLL ist.

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#7

AW: ShellExecuteEx mit Verb properties und x64

  Alt 14. Dez 2014, 11:33
Testweise hab ich nun ein Manifest mit Kompatibilität für Windows bis hoch zu Version 10 eingebaut, aber wie erwartet macht das keinen Unterschied. Ich wäre dankbar, wenn jemand mal den Code im OP testen könnte und hier mitteilt, ob das Problem nachvollziehbar ist. Das kann auch gern unter Verwendung eigener Implementationen der Wow64*FsRedirection-Funktionen passieren.

Momentan sieht's aber so aus, als wäre das ein "normales" Verhalten, denn auch Total Commander verhält sich so. Dort kann man mit cm_SwitchX64Redirection die Redirection abschalten, wechselt ins Verzeichnis %SystemRoot%\system32 und sucht dort die Datei msiexec.exe, merkt sich Größe und Datum und öffnet nun die Eigenschaften der Datei mit Alt+Enter (oder via Kontextmenü) und stellt fest: der Eigenschaften-Dialog sagt etwas anderes als TC zeigt - dasselbe Verhalten wie in obigem Testprogramm.

Windows ist doch immer wieder ein Quell neuer Phänomene ...

MfG Dalai
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: ShellExecuteEx mit Verb properties und x64

  Alt 15. Dez 2014, 09:29
Hast du die 32-Bit Version des Commanders, oder die 64-Bit-Version?

Meine 64-Bit-Version (8.51a) des TC zeigt alles richtig an und somit würde das meines Erachtens korrekt sein.

Weil mich das Thema gerade auch interessiert hab ich dein Beispiel als 32-Bit und als 64-Bit-App compiliert. Auch wahlweise mit kompletter Pfadangabe der msiexec.exe.

Werte identisch mit dem TC. Vielleicht ist das Verhalten von 32-Bit-Apps ja von MS so gewollt
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#9

AW: ShellExecuteEx mit Verb properties und x64

  Alt 15. Dez 2014, 09:53
ShellExecute startet doch ein weiteres Programm, eventuell wird aus einem 32-Bit-Programm heraus auch eine 32-Bit-Version des Properties-Anzeigen-Codes ausgeführt, welches dann ebenfall von dieser DS-Umleitung betroffen wäre.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10

AW: ShellExecuteEx mit Verb properties und x64

  Alt 15. Dez 2014, 11:02
das wäre eine logische - und auch sinnvolle - Erklärung
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz