关于LoadLibrary加载动态链接库失败

Topin27 2010-05-12 02:18:38
我使用LoadLibrary函数加载一个dll文件,部分代码如下:

g_hGetWordInst = LoadLibrary("F:\\nhw32.dll");
if (!g_hGetWordInst)
{
AfxMessageBox("NHD_LoadGetWordLib loading error!");
return FALSE;
}
其中我的dll文件放在f盘,但是却总是提示未加载成功。由于现阶段暂时没学过dll编程,所以不能确定是否是我的LoadLibrary函数使用错误,请各位路人帮帮忙。
...全文
2684 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyair624 2010-05-30
  • 打赏
  • 举报
回复
LoadLibrary("F:\\nhw32.dll");中的路径应该是无意义的

路径有意义。。上面说错
chinagudujian 2010-05-22
  • 打赏
  • 举报
回复
可能是字符集的问题 在字符串前面加_T(),或是改变一下字符集
arong1234 2010-05-21
  • 打赏
  • 举报
回复
你也太狠了,这么简单的一个问题,要这么复杂的方法干嘛?
首先要检查前面建议的GetLastError
其次要借助depends工具看看是不是少啥依赖的库没有在机器上[Quote=引用 16 楼 xiaopoy 的回复:]
挂VC调试器,断LoadLibrary上
然后设置断ntdll.RtlActivateActivationContextUnsafeFast上

这个函数执行完返回后的样子应该是类似于

Assembly code
7C93C49C . FF76 48 PUSH DWORD PTR DS:[ESI+48]
7C93C49F . 8D85 64FFFFFF LE……
[/Quote]
jianghandaxue 2010-05-21
  • 打赏
  • 举报
回复
我估计你这个库nhw32.dll,本身生成DLL时就调用了其他的DLL的支持,虽然你的nhw32.dll存在在你的盘符下也有它,但是你这个nhw32.dll实际也调用了其它的DLL......所以你loadLibrary()初始化不成功......
skyair624 2010-05-19
  • 打赏
  • 举报
回复
晕。。。为了dll载入失败没必要跟进API里吧。。。
LZ你去了解下DLL的加载过程是啥应该就清楚了。。。LoadLibrary("F:\\nhw32.dll");中的路径应该是无意义的,我不是十分确定,你可以跟踪LoadLibrary进去看看。。。
所以要么加到System32下。。要么自己目录
cyysd 2010-05-19
  • 打赏
  • 举报
回复
检查检查路径有没有写错
xiaopoy 2010-05-15
  • 打赏
  • 举报
回复
挂VC调试器,断LoadLibrary上
然后设置断ntdll.RtlActivateActivationContextUnsafeFast上

这个函数执行完返回后的样子应该是类似于
7C93C49C   .  FF76 48       PUSH DWORD PTR DS:[ESI+48]
7C93C49F . 8D85 64FFFFFF LEA EAX,DWORD PTR SS:[EBP-9C]
7C93C4A5 . 50 PUSH EAX
7C93C4A6 . E8 ED4CFEFF CALL ntdll.RtlActivateActivationContextUnsafeFast
7C93C4AB . C745 FC 02000>MOV DWORD PTR SS:[EBP-4],2
7C93C4B2 . 66:837E 3A 00 CMP WORD PTR DS:[ESI+3A],0
7C93C4B7 . 0F85 D83D0100 JNZ ntdll.7C950295
7C93C4BD > 803D 10C3997C>CMP BYTE PTR DS:[7C99C310],0
7C93C4C4 . 0F85 BDE00100 JNZ ntdll.7C95A587
7C93C4CA > FF75 08 PUSH DWORD PTR SS:[EBP+8] ; /Arg4 = 62C22EAD
7C93C4CD . 33FF XOR EDI,EDI ; |
7C93C4CF . 47 INC EDI ; |
7C93C4D0 . 57 PUSH EDI ; |Arg3 = 00000001
7C93C4D1 . FF76 18 PUSH DWORD PTR DS:[ESI+18] ; |Arg2 = 62C20000
7C93C4D4 . 53 PUSH EBX ; |Arg1 = 62C22EAD
7C93C4D5 . E8 9C4CFEFF CALL ntdll.7C921176 ; \ntdll.7C921176



7C921176是关键。
跟进入它里面

里面的东西很简单,只有一个往下层的函数调用:
7C921187 |. FF55 08 CALL NEAR DWORD PTR SS:[EBP+8]

跟入它,它就是到你的DLL的入口点(可能不是dllmain)了。
自己看下那nhw32.dll 初始化到底出啥问题
zhaohongbo83 2010-05-14
  • 打赏
  • 举报
回复
看下是不是DLL文件名、或者路径问题
如果确认没有问题,就GetLastError()看下是什么错误!
ytu2006123 2010-05-14
  • 打赏
  • 举报
回复
不要瞎猜,看看GetLastError()先
bEst_02 2010-05-13
  • 打赏
  • 举报
回复
加载dll失败,原因大致有:
1.dll初始化时失败,这是因为dll本身有问题;
2.dll需要的其他dll文件不存在;
3.调用的dll再本地机器上不存在。

请楼主自己检查,看是由那个引起的。
redsunxin 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 etz2008 的回复:]
我觉得最大的可能是
这个库还有与之关联的其它库没找到
我就遇到过这个问题
你可以用DEPENDS看看
到你还有啥子库与这个库有依存关系
[/Quote]

十楼所言极是。
leechhui 2010-05-13
  • 打赏
  • 举报
回复
出现这种情况原因可能有三个:DLL文件路径错误;参数类型(ANSI还是UNCODE);函数的返回值,好好地查一查该函数的返回值.
etz2008 2010-05-12
  • 打赏
  • 举报
回复
我觉得最大的可能是
这个库还有与之关联的其它库没找到
我就遇到过这个问题
你可以用DEPENDS看看
到你还有啥子库与这个库有依存关系
prodiving 2010-05-12
  • 打赏
  • 举报
回复
那个dll可能有bug,初始化的时候异常了,LoadLibrary也是返回失败
tanwei1002 2010-05-12
  • 打赏
  • 举报
回复
应该是路径错了
jamseyang 2010-05-12
  • 打赏
  • 举报
回复
DllMain函数中返回了FALSE吗?
wltg2001 2010-05-12
  • 打赏
  • 举报
回复
if (!g_hGetWordInst)
===============
改成if(g_hGetWordInst==NULL)试试
Eleven 2010-05-12
  • 打赏
  • 举报
回复
GetLastError()函数返回什么值。。。
renxu350 2010-05-12
  • 打赏
  • 举报
回复
注意 LoadLibrary() 等函数的 Unicode 问题。
cdsnpeter 2010-05-12
  • 打赏
  • 举报
回复
支持楼上,如果Dll路径名正确的话,请检查Dll是否又使用到别的库文件的功能,也就是说额外依赖项。
加载更多回复(2)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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