如何从句柄中获取TForm的实例?

Jer*_*dge 7 delphi dll winapi delphi-7

我正在将一些函数转换为与Windows 7功能相关的DLL.我不能通过DLL传递TForm,所以我需要传递它的句柄.除了,一旦我在另一边有这个句柄,我该如何将它重建回TForm实例?另外,通过Delphi DLL传递句柄(HWND)以与C#调用兼容的适当方法是什么?

如果不可能,那么我至少需要知道如何使用Windows API更改窗口的颜色,不参考TForm.目标是从这个DLL中,它需要以某种方式改变窗体的颜色.将句柄传递给DLL是没有问题的,但如何使用该句柄来处理句柄所代表的形式?

我正在做的是组合一个DLL,其中包含使Delphi7应用程序与Windows7兼容所需的一切,例如,绘图玻璃,在任务栏中正确显示多个表单(并最小化表单),显示绿色进展任务栏的图标,以及可能涉及的任何其他内容.这种类型的工作虽然需要修改表单.我需要能够在DLL中进行这些修改.

Rem*_*eau 8

通常,您可以使用单元中的VCL 函数HWND将a 转换为VCL TWinControl派生的对象指针.然后,您可以检查实际上是否使用运算符.FindControl()ControlsTWinControlTFormis

但是,正如其他人所说,通常在DLL边界上传递VCL对象是危险的,如果EXE和DLL都没有使用完全相同的VCL版本,RTL版本,内存管理器等进行编译,则会导致问题.要传递VCL对象安全的DLL边界,将您的DLL项目更改为BPL包项目,并确保在EXE和BPL中启用动态RTL.

  • 即使外部DLL和应用程序不共享相同的内存管理器,您也可以这样做吗?由于VMT不匹配,```运算符失败,IIRC.如果是这样,你能为DLL提供简单的源代码吗?我可以传递一个`TForm.Handle`来返回与`TForm`不同的东西,这是使用`HWND`从直接API调用中无法获得的? (2认同)

Ken*_*ite 4

你无法TForm从句柄中得到 a 。在你的 Delphi 应用程序之外没有这样的东西,除非你使用包(正如大卫的回答所说)。

您可以在 API 调用中直接使用Handle( ),但仅限于 API 调用。HWND

您可以将其HWND直接传递给 API 调用(如GetDC)以获取设备上下文 ( DC),然后DC直接将其与DrawTheme相关函数(如DrawThemeText或任何其他需要 windows 的函数)一起使用DC。您还可以将其传递给需要HWND.