我有一个要添加全屏后处理效果的程序。我没有该程序的源代码(它是专有的,尽管开发人员确实向我发送了一份调试符号的副本,.map 格式)。我有编写和工作的效果代码,没有问题。
我现在的问题是将两者联系起来。
到目前为止,我已经尝试了两种方法:
使用 Detours 修改原程序的导入表。这很好用并且保证稳定,但是我与之交谈过的用户对此并不满意,它需要安装(除了提取档案之外),并且存在一些问题,如果使用 Detours 修补程序在条款下是有效的最终用户许可协议。因此,该选项已失效。
另一种选择是传统的 DLL 替换。我已经包装了 OpenGL (opengl32.dll),我需要程序来加载我的 DLL 而不是系统副本(只需将其放入具有正确名称的程序文件夹中,这很容易)。
然后我需要我的 DLL 来加载 Cg 框架和运行时(依赖于 OpenGL)和其他一些东西。当 Cg 加载时,它会调用我的一些函数,这些函数调用 Cg 函数,并且我往往会出现堆栈溢出和无限循环。我需要能够在子目录中包含 Cg DLL 并仍然使用它们的功能(不确定是否可以让我的 DLL 导入表指向子目录中的 DLL)或者我需要动态链接它们(我' d宁愿不这样做,只是为了简化构建过程),迫使他们参考系统文件(不是我的自定义替换)。
整个链条是: 程序加载 DLL A(名为 opengl32.dll)。DLL A 加载 Cg.dll 并动态链接 (GetProcAddress) 到 sysdir/opengl32.dll。我现在需要 Cg.dll 来引用 sysdir/opengl32.dll,而不是DLL A。
这将如何完成? 编辑:如果不使用 GetProcAddress ,这将如何轻松完成?如果没有其他工作,我愿意退回到那个,但如果可能的话,我宁愿不这样做。
Edit2:我刚刚在 MSDN 文档中偶然发现了 SetDllDirectory 函数(在完全不相关的搜索中)。乍一看,这看起来像我需要的。是这样,还是我判断错误?(现在去测试它)
Edit3:我通过做一些不同的事情解决了这个问题。我没有删除 OpenGL32.dll,而是将我的 DLL 重命名为 DInput.dll。它不仅具有必须导出一个函数而不是超过 120 个函数的优点(对于程序、Cg 和 GLEW),我不必担心函数会重新运行(我可以像往常一样链接到 OpenGL) . 为了接听我需要拦截的电话,我使用了 Detours。总而言之,它工作得更好。不过,这个问题仍然是一个有趣的问题(希望将来对其他试图做疯狂事情的人有用)。两个答案都很好,所以我还不确定选哪个...