我正在编写一个DLL,该DLL通过更改注入(inject)过程的VMT中所需的指针来挂钩某些D3D功能。算法是这样的:
它在应用程序中运行完全正常,在该应用程序中,我初始化D3D,启动绘图循环,然后启动挂钩过程,但是它无法从DLL中运行-出于某种原因,它在尝试创建带有最后一个错误代码的虚拟设备时会崩溃= 126(“D3D * .dll正确加载,但找不到指定的模块”)。
我知道同一时间只能启动一个D3DDevice,但是在我的测试应用中,我可以创建1个以上的D3DDevice-只有1个作品,但是我仍然可以抓取VMT。
因此,问题是-从EXE和DLL运行相同的代码有什么区别?
最佳答案
我有同样的问题。我认为可能是,我们需要使用与创建第一个线程(主线程)相同的线程来创 build 备。
创 build 备时,我尝试了所有不同的参数组合。我尝试了不同的DX9应用程序/游戏。
我发现主线程假设不正确。我更新了DX示例的代码,并添加了自己的代码以在辅助线程上运行,并且该代码可以正常工作。我还有其他一些想法可以尝试。然后更新
问题是发生在我身上的,因为我是从DllMain调用CreateDevice()的,根据Dll Best Practices的介绍,禁止调用任何可能使线程相互交叉的函数,这将导致死锁。解决方法是follow this answer here.