1

不久前,我发表了一篇关于创建 dll 的帖子,目的是为了注入,这将导致主机应用程序触发 Nvidia Optimus 笔记本电脑以“唤醒”dGpu。这是必要的,因为此处创建的可悲系统 nvidia 导致许多应用程序无法识别电源 dGpu 的存在,而是使用集成的英特尔 gpu。(特别是一些视频处理应用程序使用英特尔的时间比使用英伟达的时间长)。那个帖子在这里

可以说,我搬到南极工作并放弃了这个项目。几年后我才把它捡回来,并决定学习(足够的)C++ 来在这里编程。我已经创建了 DLL,如果我将 DX 代码放在一个函数中,然后从主机“调用者”程序中调用该函数。它可以工作!!!但是,如果我将该代码放在 DLLMAIN 中,然后简单地从我的“调用者”程序中加载该 dll(而不实际调用特定函数)......该过程将执行!!!但是,当它到达运行 CREATEDEVICE 的代码部分时,它会崩溃。从那以后,我了解到这是由于一个称为死锁或加载器锁的问题造成的。我不确定是哪个问题。我理解这个概念,但没有任何地方接近 C++ 的理解来开发解决方法。

所以基本上..我可以使用一些解决方法在 DLLMAIN 中运行我的程序吗?也许以某种方式产生一个独立的线程(所以 DLLMAIN 可以完成执行到它的返回?)感谢您提供任何信息。我将在此处包含 vcproject 源代码.. 但这是我在网上找到的科学怪人.. 所以不要追求优雅——我对 C++ 编程几乎一无所知!http://s000.tinyupload.com/index.php?file_id=07876333208461296171

4

1 回答 1

0

加载程序锁是每个进程的锁,在您调用 LoadLibrary 之后,直到 LoadLibrary 返回之前才拥有。其目的是确保进程正确考虑加载的 DLL 及其顺序。

可以在 DllMain 中添加的代码非常少,它们不会冒失败的风险,因为任何可能导致 IPC 的 Windows 调用都可能与加载程序锁定有关。

如果您可以从进程外部创建一个线程,或者创建一个可以直接调用的第二个函数,那么这将是一个更好的解决方案

于 2017-06-27T14:24:49.167 回答