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