LoadLibrary加载动态库失败的解决办法

本文介绍了两种跨目录调用DLL的有效方法:一种是使用LoadLibraryEx函数,并结合LOAD_WITH_ALTERED_SEARCH_PATH标志;另一种是通过更改当前工作目录来实现。文章详细解释了每种方法的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式一 采用LoadLibraryEx

转载:http://blog.sina.com.cn/s/blog_62ad1b8101017qub.html

若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载。但若调用的DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用LoadLibraryEx:
LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。


方式二 采用SetCurrentDir

转载:http://blog.youkuaiyun.com/flyayi2006/article/details/5526982

跨目录调用dll,你应该这样
1 用GetCurrentDir保存当前的工作目录
2 用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢复到原来的工作路径


示例

    TCHAR chCurDir[MAX_PATH] = {0};
    GetCurrentDirectory(MAX_PATH, chCurDir);
    SetCurrentDirectory(_T("E:\\test\\"));
    m_hDLL = LoadLibrary(_T("MyTest.dll"));
    SetCurrentDirectory(chCurDir);

### 如何使用 `LoadLibrary` 函数从指定路径加载 DLL 为了确保可以从特定路径成功加载 DLL 文件,可以利用 Windows 提供的 `SetDllDirectory` 或者更推荐的方式是在调用 `LoadLibrary` 之前通过绝对路径直接传递给该函数。这种方式能够有效避免因系统默认搜索顺序而导致找不到目标库的情况。 当尝试从固定位置装载动态链接库时,应当构建完整的文件路径字符串并作为参数传入 `LoadLibraryA` 或 `LoadLibraryW`(Unicode 版本)[^1]。下面是一段 C++ 的示范代码展示了这一过程: ```cpp #include <windows.h> #include <iostream> int main() { // 定义DLL全路径名 const wchar_t* dllPath = L"C:\\path\\to\\your\\example.dll"; // 加载DLL模块 HMODULE hModule = LoadLibraryW(dllPath); if (!hModule) { std::wcerr << L"Failed to load DLL: " << GetLastError(); return EXIT_FAILURE; } // 获取导出函数地址(假设有一个名为 'ExampleFunction' 的函数) typedef int (*FuncPtr)(); FuncPtr ExampleFunction = reinterpret_cast<FuncPtr>(GetProcAddress(hModule, "ExampleFunction")); if (NULL != ExampleFunction){ // 调用DLL中的函数 int result = ExampleFunction(); std::cout << "Called function returned value:" << result << "\n"; } else{ std::wcerr << L"Could not find the specified procedure.\n"; } // 卸载DLL模块 FreeLibrary(hModule); return EXIT_SUCCESS; } ``` 这段程序首先指定了要加载DLL 的完整路径,并将其转换成宽字符形式以匹配 Unicode 编译环境下的需求;接着它会尝试打开这个 DLL 并获取其中某个具体函数的入口点以便后续执行;最后无论操作是否成功都会记得释放掉已经不再使用的句柄资源[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值