vc动态链接库的调用 LoadLibrary()路径问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vc动态链接库的调用 LoadLibrary()路径问题相关的知识,希望对你有一定的参考价值。

我现在用VC编写一个动态链接库, 应用程序设置好相对路径调用我写的DLL, 而我的DLL 又调用了别的DLL,我调用的DLL和我写的DLL是在同一个目录下的,请问我在编写DLL时用LoadLibrary()加载其他的DLL的时候怎么解决这个路径问题,谢谢
请问 我再DLL 写 BSTR[100]; GetCurrentDir(BSTR); 可是提示 不认识这函数 ,谢谢

你在问题补充里面说的非常正确

你需要通过改变工作目录(work path)来使得你的DLL能够正确的加载别人的DLL,我也遇到过这个问题

根据你说的情况,你应该这样
1 用GetCurrentDir保存当前的工作目录
2 用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢复到原来的工作路径
参考技术A DLL加载进程序的时候就属于程序的一部分所以 LoadLibrary 的当前目录就是EXE所在的目录。

举个例子

c:\a\1.exe
c:\b\2.dll
c:\c\3.dll

这种情况 1.exe 加载2.dll 就是 LoadLibrary("..\b\2.dll")

而2.dll加载3.dll一样的写法。
参考技术B 默认搜索顺序是:
1.当前程序所在目录下查找
2.系统环境变量Path指定的有个系统路径序列,按照先后顺序一步步查找。

最好将第三方dll的路径加入系统环境变量Path的最后。
或者绝对路径或者相对路径 .. or . 来控制
参考技术C 同一目录的话直接写上DLL的名字就可以了。不放心的话就写上绝对路径。 参考技术D char
exepath[MAX_PATH];
char
dllpath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,
exepath);
//保存当前工作目录
GetModuleFileName(GetModuleHandle("我写的DLL的名字.dll"),
dllpath,
MAX_PATH);
//获取我写的DLL的路径
*strrchr(dllpath,
'\\')
=
'\0';
//取路径前面的目录
SetCurrentDirectory(dllpath);
//将DLL所在的目录设置为当前工作目录
HMODULE
lib
=
LoadLibrary("我调用的DLL的名字.dll");
//直接Load就可以了
FreeLibrary(lib);
SetCurrentDirectory(exepath);
//别忘了恢复当前工作目录

以上是关于vc动态链接库的调用 LoadLibrary()路径问题的主要内容,如果未能解决你的问题,请参考以下文章

请教python调用dll动态库的传参问题

与主执行模块和动态库的 2 路通信

opencv静态链接库有啥用

2017-2018-2 20155228 《信息安全系统设计原理》 动态库的生成和调用

Android怎么调用第三方SO动态链接库

VC++程序设计与应用--动态链接库