C++ 从D3D钩子释放资源

C++ 从D3D钩子释放资源,c++,directx,hook,C++,Directx,Hook,我有一个DLL,可以钩住另一个应用程序的D3D调用。特别是,它创建了一些用于渲染的纹理。但是,当目标应用程序在移除挂钩之前关闭时,有时会导致出现非零引用计数错误消息。显然,这是因为钩子拥有的纹理没有及时释放 我能够通过挂接重置调用并释放资源,在调整窗口大小时消除这个错误;但是,我不确定当窗口实际释放时该怎么办。我可以挂接Release方法,但是我看不到明确的方法来判断设备是否真的被破坏了,或者它的引用计数只是在减少。原始发布调用的返回值并没有告诉我多少,因为钩子的纹理仍然保存着对设备的引用,而跟

我有一个DLL,可以钩住另一个应用程序的D3D调用。特别是,它创建了一些用于渲染的纹理。但是,当目标应用程序在移除挂钩之前关闭时,有时会导致出现非零引用计数错误消息。显然,这是因为钩子拥有的纹理没有及时释放

我能够通过挂接重置调用并释放资源,在调整窗口大小时消除这个错误;但是,我不确定当窗口实际释放时该怎么办。我可以挂接Release方法,但是我看不到明确的方法来判断设备是否真的被破坏了,或者它的引用计数只是在减少。原始发布调用的返回值并没有告诉我多少,因为钩子的纹理仍然保存着对设备的引用,而跟踪这些引用似乎太多了


我可以简单地在调用release时释放所有纹理,然后在再次需要它们时重新创建,但由于释放挂钩可能会由D3D代码中的隐式释放调用触发,这可能会导致太多开销。例如,如果主机应用程序创建一些小资源并在每个帧中释放它,这可能会导致钩子放弃并在每个帧上重新创建所有纹理,这是相当昂贵的。

由于主题作者从未回到这里,我想提供我的问题解决方案。实现一个代理D3D类,它应该保留对真实接口的引用,而不是挂接特定函数。销毁时,它会释放接口。现在要解决您的问题,因为您知道真实接口在类之前是不可能发布的,所以从代理发布中调用真实发布方法,如果引用计数达到1,则释放资源并销毁代理类