Delphi 10.1 ShellExecute错误不兼容类型'HWND'和'TWindowsHandle'

时间:2016-10-09 22:58:59

标签: delphi shellexecute

我在Delphi 10.1中遇到以下代码的问题:

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

当我尝试运行代码时,它会给我这个错误:

  

不兼容的类型:'HWND'和'TWindowHandle'

2 个答案:

答案 0 :(得分:4)

在FireMonkey中,表单的Handle属性类型为TWindowHandle(在FMX.Types单元中定义的类)。在Windows上,它实现为TWinWindowHandleFMX.Platform.Win单元中定义的TWindowHandle的子类)。

TWinWindowHandleHWND句柄存储在其Wnd属性中。

要获得实际的HWND句柄,您需要使用FmxHandleToHWND()

ShellExecute(FmxHandleToHWND(Handle), 'open', PChar(filename), '', '', SW_SHOWNORMAL);

这会将TWindowHandle转换为TWinWindowHandle(使用WindowHandleToPlatform),然后返回其Wnd属性值。

已更新(根据Remy的评论):

Remy指出,FmxHandleToHWND被记录为不推荐使用(从XE4开始)。这似乎没有被最新的源代码备份,在Delphi 10.1柏林RTM版本的情况下似乎已经删除了通常的deprecated修饰符,但让我们为了安全起见文档的话

而不是FmxHandleToHWND我们建议您完全按照FmxHandleToHWND执行操作,即调用WindowHandleToPlatform并访问Wnd属性,因此:

ShellExecute(WindowHandleToPlatform(Handle).Wnd, 'open', PChar(filename), '', '', SW_SHOWNORMAL);

更好的选择是使用FormToHWND,这比FmxHandleToHWND更直接替代WindowHandleToPlatform(我们可以想知道为什么文档没有指出我们在这个例程中,虽然可能的答案是文档作者错了):

ShellExecute(FormToHWND(Handle), 'open', PChar(filename), '', '', SW_SHOWNORMAL);

答案 1 :(得分:1)

TWindowHandle是FireMonkey类。 HWND是Windows句柄。这些是完全不同的类型。

对于VCL,可以将TForm.Handle之类的HWND传递给ShellExecute()。对于FireMonkey(FMX),它不是,因为它是TWindowHandle

使用单位GetDesktopWindow()中的Winapi.Windows代替:

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