【问题标题】:Using Direct2D across DLL boundaries跨 DLL 边界使用 Direct2D
【发布时间】: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 调用也有限制,这可能是也可能不是这里的原因,但总是设法让我绊倒。

标签: c++ c winapi dll direct2d


【解决方案1】:

这使我认为跨越 DLL 边界必须与操作混为一谈。 DLL 是否总是与附加进程在同一个线程中运行?跨越 DLL 边界是否还有其他一些奇怪的地方,尤其是在 Direct2D 方面?

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 2011-07-03
      • 2012-11-15
      • 2016-11-15
      • 1970-01-01
      相关资源
      最近更新 更多