DLL加载失败

kanguolaikanguolaik 2010-10-26 10:20:02
HINSTANCE hInst = LoadLibrary(TEXT("testdll.dll"));
if(!hInst)
{
MessageBox(TEXT("Fail to load dll."));
return;
}

总是返回加载失败。。

testdll.dll已经在当前目录中了。。。。。。

为什么????
...全文
208 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
FengRider 2010-10-28
  • 打赏
  • 举报
回复
想了很久,实在是不好确定,难道是路径中有空格或者是汉字的原因引起的?
一般我用LoadLibrary的时候,里面就不用TEXT这个函数。如果TEXT函数中的参数字符串包含中文或者其它非英语半角标点字符,可能会引发一些意外的问题。
  • 打赏
  • 举报
回复
没人回复。。 加分
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]
GetLastError的错误码是什么?
[/Quote]

返回127 找不到指定的程序。
  • 打赏
  • 举报
回复
DLL模块的cpp文件:
#include <Windows.h>
#include <string>
#include <Shlwapi.h>
#pragma comment(lib,"shlwapi.lib")
using namespace std;

BOOL APIENTRY DllMain(HINSTANCE hInst,DWORD dwReason,LPVOID lpReserved)
{
if(DLL_PROCESS_ATTACH == dwReason)
DisableThreadLibraryCalls(hInst);

return TRUE;
}


BOOL _stdcall RegWrite()
{
HKEY hKey = NULL;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("Software\\abcd"),0,KEY_ALL_ACCESS,&hKey))
{
DWORD dwType = REG_DWORD;
DWORD dwValue = 1234;
DWORD dwValueLen = sizeof(DWORD);
if(ERROR_SUCCESS == RegSetKeyValue(hKey,TEXT("a"),0,dwType,(const BYTE*)&dwValue,dwValueLen))
{
}

dwType = REG_SZ;
string str = "hello helo.";
const char *pstr = str.c_str();
dwValueLen = str.length();
if(ERROR_SUCCESS == RegSetKeyValue(hKey,TEXT("b"),0,dwType,(const BYTE*)pstr,dwValueLen))
{
}

dwType = REG_BINARY;
char buf[4] = {0};
buf[0] = 0x01;
buf[1] = 0x02;
buf[2] = 0x03;
buf[3] = 0x04;
dwValueLen = sizeof(buf);
if(ERROR_SUCCESS == RegSetKeyValue(hKey,TEXT("c"),0,dwType,(const BYTE*)buf,dwValueLen))
{
}

RegCloseKey(hKey);
}

return TRUE;
}

BOOL _stdcall RegDelete()
{
SHDeleteKey(HKEY_CURRENT_USER,TEXT("Software\\abcd1"));
SHDeleteValue(HKEY_CURRENT_USER,TEXT("Software\\abcd"),TEXT("d"));

return TRUE;
}

DLL模块的def文件:
LIBRARY "testdll"
EXPORTS
RegWrite
RegDelete

调用DLL的模块:
void CTestapp2Dlg::OnButton1()
{
HINSTANCE hInst = LoadLibrary(TEXT("C:\\Documents and Settings\\Administrator\\桌面\\testapp2\\testdll.dll"));
DWORD ret = GetLastError();

if(!hInst)
{
MessageBox(TEXT("Fail to load dll."));
return;
}

typedef BOOL (_stdcall *REGWRITE)();
typedef BOOL (_stdcall *REGDELETE)();

REGWRITE RegWriteFunc = (REGWRITE)GetProcAddress(hInst,"RegWrite");
REGDELETE RegDeleteFunc = (REGDELETE)GetProcAddress(hInst,"RegDelete");

if(!RegWriteFunc || !RegDeleteFunc)
{
MessageBox(TEXT("Fail to load func."));
FreeLibrary(hInst);
return;
}

RegWriteFunc();
RegDeleteFunc();

FreeLibrary(hInst);
}
luciferisnotsatan 2010-10-26
  • 打赏
  • 举报
回复
GetLastError的错误码是什么?
ouyh12345 2010-10-26
  • 打赏
  • 举报
回复
\\桌面\testapp2

\\桌面\\testapp2
路径中最后不要有汉字
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fengrider 的回复:]
1、去掉TEXT函数试试;
2、你将testdll.dll绝对路径加上去试试看。

怀疑加载失败的原因是因为字符转化后的DLL路径,无法被LoadLibrary识别。用上述两种方法分别试一下看看具体是什么情况
[/Quote]

HINSTANCE hInst = LoadLibrary(TEXT("C:\\Documents and Settings\\Administrator\\桌面\testapp2\\testdll.dll"));
if(!hInst)
{
MessageBox(TEXT("Fail to load dll."));
return;
}

改成了绝对路径 还是不行。。。 去掉了TEXT后也是不行。。。怪了 以前从来没遇到过这种情况。。
ouyh12345 2010-10-26
  • 打赏
  • 举报
回复
GetLastError返回什么?
路径、依赖库是否都满足?
FengRider 2010-10-26
  • 打赏
  • 举报
回复
1、去掉TEXT函数试试;
2、你将testdll.dll绝对路径加上去试试看。

怀疑加载失败的原因是因为字符转化后的DLL路径,无法被LoadLibrary识别。用上述两种方法分别试一下看看具体是什么情况

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧