【发布时间】:2013-12-12 09:18:12
【问题描述】:
所以我开始用 C 编写一个需要大量精美绘图的程序,但我严格使用 Windows,所以我决定使用 Direct2D。
到目前为止,我在 DLL 中创建了一个自定义控件,程序像任何其他 Win32 控件一样使用和使用该控件。自定义控件在其窗口内设置了一个 D2D 上下文,并根据需要将其绘制到其中,这工作正常。
我意识到这将在未来的项目中提供一个非常有用的 DLL,以便通过传统控件界面轻松设置和拆除 Direct2D,因此我让控件在绘制时向父窗口发送通知,而不是调用它自己的内部绘图代码(基本上就像所有者绘制的控件)。它调用 BeginDraw,然后使用包含指向 ID2D1DCRenderTarget 的指针的自定义 NMHDR 向父级发送通知,然后调用 EndDraw。在我的主窗口中,我创建了控件,然后响应通知,然后调用方法来绘制内容,然后返回。
问题是当在 DLL 中调用 EndDraw 时,我收到错误“对象未处于正确的状态以处理该方法”。这使我认为跨越 DLL 边界必须与操作混为一谈。 DLL 是否总是与附加进程在同一个线程中运行?跨越 DLL 边界是否还有其他一些奇怪的地方,尤其是在 Direct2D 方面?
谢谢。
【问题讨论】:
-
你真的应该使用调试器。您将立即查看您的线程怀疑是否正确。
-
所以我一直在使用 Visual Studio 2012 及其调试器来解决这个问题,但我并不精通调试这样的东西。我会很感激一些关于如何使用调试器来阐明问题的指示。
-
调用 DLL 就像调用任何其他函数一样。我会查看您是否收到消息交错问题(即,如果您在结束消息之前收到额外的开始消息)。
-
COM 在处理因另一个 COM 调用而发送的消息时,对进行 COM 调用也有限制,这可能是也可能不是这里的原因,但总是设法让我绊倒。