ssu*_*ube 6 c++ dll dynamic-linking wrapper visual-studio
我有一个程序,我正在添加全屏幕后处理效果.我没有该程序的源代码(它是专有的,虽然开发人员确实向我发送了调试符号的副本,.map格式).我有编写和工作的效果的代码,没有问题.
我现在的问题是将两者联系起来.
到目前为止我尝试了两种方法:
使用Detours修改原始程序的导入表.这很好用并且保证稳定,但是我所谈到的用户对它不满意,它需要安装(除了提取存档之外),并且如果使用Detours修补程序在条款下有效则存在一些问题EULA.那么,那个选择就出来了.
另一种选择是传统的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(完全不相关的搜索).乍一看,这看起来像我需要的.这是对的,还是我的错误判断?(关闭现在测试)
编辑3:我通过做一些不同的事情来解决这个问题.我没有删除OpenGL32.dll,而是将我的DLL重命名为DInput.dll.它不仅具有导出一个函数而不是超过120的优势(对于程序,Cg和GLEW),我不必担心运行的函数(我可以像往常一样链接到OpenGL) .为了进入我需要拦截的电话,我正在使用Detours.总而言之,它的效果要好得多.但是,这个问题仍然是一个有趣的问题(希望将来对其他任何试图做疯狂事情的人都有用).答案都很好,所以我不确定要选哪个...
SetDllDirectory 可能不起作用。Cg.dll 可能只是链接到 OpenGL.dll。当操作系统加载 Cg.dll 时,它发现已经加载了一个使用该名称(您的)的模块,因此它将 Cg 与其链接,而不是去寻找其他副本。也就是说,SetDllDirectory 修改的搜索顺序根本不会发挥作用,因为操作系统不执行任何搜索。
我怀疑你最好的选择确实是检测对你的库的重入调用。当您检测到一个时,不进行自定义处理,而是将调用直接转发到真正的 OpenGL 库,由于调用 LoadLibrary,然后为每个库的函数调用 GetProcAddress,您可以引用该库。
归档时间: |
|
查看次数: |
483 次 |
最近记录: |