![]() |
1
1
可能是setdllddirectory 不会 工作。cg.dll可能只是链接到opengl.dll。当操作系统加载cg.dll时,会发现已经有一个模块加载了这个名称(您的),因此它将cg与这个名称链接起来,而不是去寻找其他副本。也就是说,setdllddirectory修改的搜索顺序甚至不会起作用,因为操作系统不进行任何搜索。 我怀疑你最好的办法是检测到你图书馆的再入者呼叫。当您检测到一个调用时,不要进行自定义处理,而是将调用直接转发到真正的OpenGL库,因为调用了LoadLibrary,所以您可以引用该库,然后针对每个库的函数使用getProcAddress。 |
![]() |
2
1
您可以使用激活上下文的魔力来尝试解决您的问题。 很大程度上取决于系统中的第三方组件是否已经有清单-以及篡改这些清单的程度可能构成许可证违规。 为了解决DLL版本控制问题,WindowsXP采用了一种称为激活上下文的技术。有时被称为并排装配,甚至是可怕的 Application Isolation 把大量的阅读总结成一个小空间: 清单是可以描述程序集或对程序集的依赖关系的XML数据块。程序集是清单及其dll。
之所以存在,是因为程序集可以采用简单的dll。”comctl32.dll”及其版本号(v6),并创建一个更大、更唯一的名称,这样简单dll的多个版本就可以安全地安装在同一位置。组件将安装在
当清单文件描述程序集中的DLL时,它称为程序集清单。通常与DLL有不同的名称。 当清单文件描述dll或exe使用的程序集时,它称为应用程序清单,通常嵌入为rt_清单资源-在res id为1的exes中,在res id为2的dll中-或在磁盘上作为名为“appname.exe.manifest”/“dll name.dll.2.manifest”的文件。 应用程序清单定义了一个称为激活上下文的东西——它基本上是一个Windows将搜索的名称空间。 每个清单都创建一个激活上下文。每个激活上下文都有一个简单的dll名称到程序集的映射。 因此,如果使用 你的 opengl32.dll文件,并为引用(本地opengl32.dll)文件的app.exe创建激活上下文,那么,尽管名称非常相似,但所有剩余的dll可能(并且将)继续使用系统opengl32.dll文件。 科夫特 . 问题是,应用程序清单的res id-1-意味着它用于创建进程默认激活上下文-所以所有没有自己的显式清单(CG?)的DLL。将搜索进程默认空间并找到opengl32.dll 所以你必须为 每一个 尚未嵌入的dll,请确保不引用opengl32.dll程序集,该程序集应允许还原为默认搜索顺序并在正常system32位置找到该程序集。 这意味着您的opengl32.dll不能在exe的文件夹中,因为该文件夹在system32之前搜索dll(您依赖的挂钩事实)。 我们通过系统在搜索程序集时采用的相当简单的搜索顺序来保存。首先,它在WinSx中搜索。您的opengl32.dll将不在其中,安装有一个困难的问题。然后它在exe文件夹中搜索 子文件夹 使用程序集的名称,然后它直接在exe文件夹中搜索程序集清单。 这意味着您可以创建一个称为“openglhook”的程序集。 您的文件夹结构如下:
嗯,祝你好运? |
|
Guilherme Albertini · DLL中的类 6 年前 |
![]() |
Naomi · C#dll资源文件更改语言 6 年前 |
![]() |
AidanH · C#DLL语言翻译实现[关闭] 6 年前 |
![]() |
subham · DLL函数调用不工作 6 年前 |
![]() |
PixelThis · 为什么我的DLL要求我的程序有一个特定的名称? 6 年前 |
![]() |
nemo · DLL的“好”调用约定是什么? 7 年前 |