跨DLL边界使用Direct2D

Using Direct2D across DLL boundaries

本文关键字:Direct2D 边界 DLL      更新时间:2023-10-16

所以我开始用C语言编写一个程序,这需要很多花哨的绘图,但我严格使用Windows,所以我决定使用Direct2D。

到目前为止,我在DLL中创建了一个自定义控件,该程序像使用任何其他Win32控件一样使用该控件。自定义控件在其窗口中设置了一个D2D上下文,并根据需要绘制到其中,这很好。

我意识到这将在未来的项目中成为一个非常有用的DLL,可以通过传统的控件界面轻松地设置和拆除Direct2D,所以我让控件在绘图时向父窗口发送通知,而不是调用自己的内部绘图代码(基本上像所有者绘制的控件)。它调用BeginDraw,然后使用自定义NMHDR向父级发送通知,其中包括指向ID2D1DCRenderTarget的指针,然后调用EndDraw。在我的主窗口中,我创建控件,然后响应通知,然后调用方法来绘制内容,然后返回。

问题是,当在DLL中调用EndDraw时,我会得到错误"对象的状态不正确,无法处理该方法"。这让我觉得跨越DLL边界一定会影响操作。DLL是否总是在与附加进程相同的线程中运行?跨越DLL边界是否还有其他奇怪之处,尤其是在Direct2D方面?

谢谢。

这让我觉得跨越DLL边界一定会影响操作。DLL是否总是在与附加进程相同的线程中运行?跨越DLL边界是否还有其他奇怪之处,尤其是在Direct2D方面?

不,调用不同DLL中的函数与调用方调用同一模块中的函数没有什么不同。请记住,标准Windows控件总是存在于与其主机不同的模块中,例如user32.dll、comctl32.dll等。

代码中的问题与驻留在不同模块中的问题无关。

感谢您的回复!刚刚意识到这与DC与RenderTarget的绑定有关,所以怪我。