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中进行这些修改.
通常,您可以使用单元中的VCL 函数HWND将a 转换为VCL TWinControl派生的对象指针.然后,您可以检查实际上是否使用运算符.FindControl()ControlsTWinControlTFormis
但是,正如其他人所说,通常在DLL边界上传递VCL对象是危险的,如果EXE和DLL都没有使用完全相同的VCL版本,RTL版本,内存管理器等进行编译,则会导致问题.要传递VCL对象安全的DLL边界,将您的DLL项目更改为BPL包项目,并确保在EXE和BPL中启用动态RTL.
你无法TForm从句柄中得到 a 。在你的 Delphi 应用程序之外没有这样的东西,除非你使用包(正如大卫的回答所说)。
您可以在 API 调用中直接使用Handle( ),但仅限于 API 调用。HWND
您可以将其HWND直接传递给 API 调用(如GetDC)以获取设备上下文 ( DC),然后DC直接将其与DrawTheme相关函数(如DrawThemeText或任何其他需要 windows 的函数)一起使用DC。您还可以将其传递给需要HWND.