【发布时间】:2013-03-25 21:30:59
【问题描述】:
我想创建一个 DLL 插件来与 Delphi 和其他语言(主要是 C++)一起使用。 如何以 C++ 和 Delphi 友好的方式传递位图?它可以只是 Delphi TBitmap 的句柄吗? C++程序应该可以用WinApi解码吧?
【问题讨论】:
标签: delphi visual-c++ dll
我想创建一个 DLL 插件来与 Delphi 和其他语言(主要是 C++)一起使用。 如何以 C++ 和 Delphi 友好的方式传递位图?它可以只是 Delphi TBitmap 的句柄吗? C++程序应该可以用WinApi解码吧?
【问题讨论】:
标签: delphi visual-c++ dll
您不能传递 Delphi TBitmap 对象,因为这仅对 Delphi 代码有意义。你需要传递的是一个HBITMAP,一个Windows 位图的句柄。
Delphi TBitmap 类只是 Windows 位图的包装器,可以提供 HBITMAP 句柄。您需要注意的是这些句柄的所有权。
如果你有一个 Delphi TBitmap,你可以通过调用 TBitmap 的 ReleaseHandle 方法得到一个 HBITMAP。 ReleaseHandle 返回的句柄不再由 TBitmap 对象拥有和管理,这正是您想要的。您将该句柄传递给 C++ 代码并让它成为所有者。它负责处理该句柄。
ReleaseHandle 的文档说:
返回位图句柄,使 TBitmap 对象不再 知道句柄。
使用 ReleaseHandle 解除位图与位图句柄的关联。 当您需要为例程或对象提供位图句柄时使用它 这将承担(或销毁)位图句柄的所有权。
在另一个方向上,您的 Delphi 代码将从 C++ 代码接收到HBITMAP 并获得所有权。通过分配给TBitmap 实例的Handle 属性来做到这一点。
细节会因语言而异,但无论如何,都可以处理HBITMAP。
【讨论】:
procedure ChangeBitmap(var BmpHandle: hBitmap); var Bmp: TBitmap; begin Bmp.Handle := BmpHandle; /*change the bitmap*/ BmpHandle := Bmp.ReleaseHandle; end;
Bmp 是一个从未实例化的本地。但是,忽略这一点,它在做什么?
Bmp!