2016-10-09 3 views
0

ich ein Problem mit dem folgenden Code in Delphi haben 10.1:Delphi 10.1 ShellExecute Fehler inkompatible Typen 'HWND' und 'TWindowsHandle'

ShellExecute(handle,'open',PChar(filename), '','',SW_SHOWNORMAL); 

Wenn ich versuche, den Code gibt es mir, diesen Fehler zu laufen:

Incompatible Types: 'HWND' and 'TWindowHandle'

+0

Versuchen Sie, den 'handle' -Parameter auf' 0' zu ändern. –

+1

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? –

+0

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. –

Antwort

1

Eine TWindowHandle ist eine FireMonkey-Klasse. A HWND ist ein Windows-Handle. Dies sind völlig verschiedene Arten.

Für die VCL ist es in Ordnung, etwas wie TForm.Handle, das ist eine HWND, zu ShellExecute() zu übergeben. Für FireMonkey (FMX) ist dies nicht der Fall, da dies eine TWindowHandle ist.

GetDesktopWindow() Verwenden von Einheit Winapi.Windows statt:

ShellExecute(GetDesktopWindow, 'open', PChar(filename), '', '', SW_SHOWNORMAL); 
+0

Verwenden Sie das Desktop-Fenster nicht als Fensterbesitzer. Pass 0 ist wahrscheinlich der sauberste. –

+0

https://blogs.msdn.microsoft.com/oldnewthing/20040224-00/?p=40493 –

+0

@David - Wie Jordan (inno-setup) kommentierte auf der Seite, die Sie verknüpften, das Beispiel, das Raymond gibt, ist nicht genau. Ich bezweifle, dass es jemals richtig war. Vielleicht auf 9x .. Systemen .... –

4

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); 
+0

'FmxHandleToHWND()' ist veraltet, Sie sollten jetzt 'WindowHandleToPlatform()' direkt verwenden, zB: 'ShellExecute (WindowHandleToPlatform (Handle) -> Wnd, 'öffnen', PChar (filename), '', '', SW_SHOWNORMAL); ' –

+0

Aktualisierte Antwort, um die Behauptung der Dokumentation zu berücksichtigen – blong

+0

Es ist keine Behauptung, es ist wirklich als veraltet im Quellcode markiert und ist seit einer Weile. Ein einfacherer Weg, den 'HWND' eines' TForm' zu erhalten, ist die Verwendung des ['FormToHWND()'] (http://docwiki.embarcadero.com/Libraries/en/FMX.Platform.Win.FormToHWND) Funktion in der 'FMX.Platform.Win'-Einheit, zB: 'ShellExecute (FormToHWND (Selbst),' Öffnen ', PChar (Dateiname),' ',' ', SW_SHOWNORMAL);' –

Verwandte Themen