Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在运行时更改要加载的dll的名称吗?_C++_Windows_Dll - Fatal编程技术网

C++ 我可以在运行时更改要加载的dll的名称吗?

C++ 我可以在运行时更改要加载的dll的名称吗?,c++,windows,dll,C++,Windows,Dll,假设我有一个名为middle.dll的dll,它正在从runme.dll导入函数 我现在有了一个替换的runmeDBG.dll,它的所有函数都导出为runme.dll 是否有一种方法可以使用middle.dll,但将其链接到从runmeDBG.dll而不是runme.dll导出的函数 我可以更改middle.dll的代码,但不知道构建middle.dll时将包含要使用的函数的dll的名称 (所有这些都是在C/C++和Mingw工具集的上下文中)如果您通过使用GetProcAddress访问DLL

假设我有一个名为middle.dll的dll,它正在从runme.dll导入函数

我现在有了一个替换的runmeDBG.dll,它的所有函数都导出为runme.dll

是否有一种方法可以使用middle.dll,但将其链接到从runmeDBG.dll而不是runme.dll导出的函数

我可以更改middle.dll的代码,但不知道构建middle.dll时将包含要使用的函数的dll的名称


(所有这些都是在C/C++和Mingw工具集的上下文中)

如果您通过使用
GetProcAddress
访问DLL中的所有函数,那么是的,您可以在运行时切换出使用的模块。只需加载替代模块(请参见
LoadLibrary
),并将其句柄用作
GetProcAddress
的参数


你不会想用这个太多,但是,它会变得非常乏味

我假设middle.dll不是您的,它静态链接到runme.dll。不,在静态链接的情况下,无法更改dll名称;但是,您可以将runmeDBG.dll重命名为runme.dll,并将其放置在dll加载程序可以找到它的地方。或者使用清单将可执行文件直接指向特定路径。runme.dll不需要位于特定路径,是吗?

只需重命名替换项并将其放在与可执行文件相同的目录中。

这个问题很老,但我首先在谷歌找到它,因为我遇到了一个非常类似的问题,然后在其他地方找到了更好的解决方案。我发现的解决方案在另一个线程中进行了解释:延迟加载DLL


例如,如果一个DLL被设计成静态链接(接口中有类),但是您需要在不更改其接口的情况下动态加载它,那么这种技术可能非常有用。您只需告诉Windows延迟加载DLL,当它实际加载DLL时,Windows会调用预加载挂钩,然后您只需返回具有相同接口的不同DLL(可能具有不同名称)的句柄。

您的意思是隐式而非静态。你不能静态链接到动态链接库。在我的例子中,middle.dll实际上是我的,但我无法控制包含它需要调用的某些函数的dll的名称。如果静态链接到dll,答案似乎是否定的。是,如果不需要在运行时切换,并且可以更改二进制文件,那么这是一个可行的解决方案。