跨DLL边界使用Direct2D

时间:2013-11-26 23:59:43

标签: c++ c winapi dll direct2d

所以我开始在C中编写一个需要大量绘图的程序,但我严格依赖Windows,所以我决定使用Direct2D。

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

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

问题是当在DLL中调用EndDraw时,我收到错误“对象未处于处理方法的正确状态”。这让我觉得跨越DLL边界必须与操作混淆。 DLL总是在与附加进程相同的线程中运行吗?关于穿越DLL边界还有其他一些奇怪的地方,特别是关于Direct2D吗?

感谢。

2 个答案:

答案 0 :(得分:0)

  

这让我觉得跨越DLL边界必须与操作混淆。 DLL总是在与附加进程相同的线程中运行吗?关于穿越DLL边界还有其他一些奇怪的地方,特别是关于Direct2D吗?

不,调用位于不同DLL中的函数与调用与调用者相同的模块中的函数没有什么不同。请记住,标准Windows控件始终存在于与其主机不同的模块中,例如user32.dll,comctl32.dll等。

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

答案 1 :(得分:0)

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