In Firemonkey, eine Handle
Eigenschaft ist die Form des Typs TWindowHandle
(eine Klasse in der FMX.Types Einheit definiert). Unter Windows wird es als TWinWindowHandle
implementiert (eine Unterklasse von TWindowHandle
, definiert in der Einheit FMX.Platform.Win).
TWinWindowHandle
speichert den HWND
Griff in seiner Wnd
Eigenschaft.
ShellExecute(FmxHandleToHWND(Handle), 'open', PChar(filename), '', '', SW_SHOWNORMAL);
Dies wirft die TWindowHandle
-TWinWindowHandle
(mit WindowHandleToPlatform
) und kehrt dann seinen Wnd
Eigenschaftswert:
Um den tatsächlichen HWND
Griff zu bekommen, würden Sie FmxHandleToHWND()
verwenden müssen.
Aktualisiert (basierend auf Remy Kommentare):
Remy weist darauf hin, dass die FmxHandleToHWND
dokumentiert ist veraltet werden (von XE4 an). Dies scheint nicht durch den neuesten Quellcode gesichert zu sein, der im Falle der Delphi 10.1 Berlin RTM Version den üblichen Modifikator deprecated
fallen gelassen zu haben scheint, aber nehmen wir das Dokumentationswort dafür, nur um sicher zu sein.
Statt FmxHandleToHWND
ist es ratsam, genau das zu tun, was FmxHandleToHWND
tut, die WindowHandleToPlatform
und Zugriff auf die Wnd
Eigenschaft zu nennen ist, so:
ShellExecute(WindowHandleToPlatform(Handle).Wnd, 'open', PChar(filename), '', '', SW_SHOWNORMAL);
Eine bessere Option wäre aber sein FormToHWND
zu verwenden, die ist ein direkter Ersatz für FmxHandleToHWND
als WindowHandleToPlatform
(und wir können fragen, warum die Dokumentation an dieser Routine zeigt uns nicht, auch wenn die wahrscheinliche Antwort es der docs Schreiber jetzt noch falsch ist):
ShellExecute(FormToHWND(Handle), 'open', PChar(filename), '', '', SW_SHOWNORMAL);
Versuchen Sie, den 'handle' -Parameter auf' 0' zu ändern. –
Fragen Sie sich, warum Sie dort "Handle" übergeben. Das ist der FMX 'handle' eines Formulars in deiner App, vermute ich. Weißt du, was ShellExecute mit diesem Argument macht? Gibt es einen guten Grund, warum du nicht einfach "0" passierst? Was hat dich dazu getrieben, einen anderen Wert zu überschreiten? Wie gut, wenn überhaupt, verstehst du, wie dieses Argument benutzt wird?Wenn Sie es nicht gut verstehen, warum rufen Sie dann die Funktion an? –
Verwenden Sie 'ShellExecute' nicht, da Fehler nicht auf nützliche Weise gemeldet werden. Verwenden Sie 'ShellExecuteEx', das tut. Suchen Sie sogar nach Fehlern? Möchten Sie das 'open'-Verb explizit verwenden, oder möchten Sie das Standardverb wirklich ausführen? Ist 'Dateiname 'eine ausführbare Datei? Wenn ja, dann sollten Sie einen neuen Prozess mit 'CreateProcess' erstellen, anstatt die Shell dazu zu bringen, die Arbeit zu erledigen. –