Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跨DLL边界使用Direct2D_C++_C_Winapi_Dll_Direct2d - Fatal编程技术网

C++ 跨DLL边界使用Direct2D

C++ 跨DLL边界使用Direct2D,c++,c,winapi,dll,direct2d,C++,C,Winapi,Dll,Direct2d,所以我开始用C语言编写一个程序,这个程序需要很多漂亮的绘图,但我严格使用Windows,所以我决定使用Direct2D 现在,我在DLL中创建了一个自定义控件,该程序使用该控件,就像使用任何其他Win32控件一样。自定义控件在其窗口内设置D2D上下文,并根据需要将其绘制到其中,这很好 我意识到这将在未来的项目中成为一个非常有用的DLL,可以通过传统的控件接口轻松设置和拆除Direct2D,因此我让控件在绘图时向父窗口发送通知,而不是调用自己的内部绘图代码(基本上类似于所有者绘制的控件)。它调用B

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

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

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

问题是,当在DLL中调用EndDraw时,我得到错误“对象未处于正确的状态,无法处理该方法”。这让我觉得跨越DLL边界一定会影响操作。DLL是否始终与连接的进程在同一线程中运行?穿越DLL边界是否还有其他奇怪之处,特别是在Direct2D方面

谢谢

这让我觉得跨越DLL边界一定会影响操作。DLL是否始终与连接的进程在同一线程中运行?穿越DLL边界是否还有其他奇怪之处,特别是在Direct2D方面

不,调用位于不同DLL中的函数与调用方在同一模块中调用函数无异。请记住,标准Windows控件始终存在于与其主机不同的模块中,例如user32.dll、comctl32.dll等


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

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

你真的应该使用调试器。您将立即看到您对线程的怀疑是否正确。因此,我使用Visual Studio 2012及其调试器对其进行了一段时间的研究,但我不太擅长调试这样的东西。我希望您能给我一些关于如何使用调试器来解决这个问题的建议。调用DLL就像调用任何其他函数一样。我会查看您是否遇到消息交错问题(即,如果您在结束消息之前收到额外的开始消息)。COM在处理另一个COM调用所发送的消息时,对进行COM调用也有限制,这可能是原因,也可能不是原因,但总是设法让我绊倒。