装载dll文件提示“LoadLibrary失败”怎么解决?一用户在开发程序时写了一个dll文件,但是在调用dll文件时出错了,提示“LoadLibrary failed witherror126:找不到指定的模块。”,这是怎么回事呢?下面小编给大家分析出现LoadLibrary失败的原因及解决办法。
一、出现LoadLibrary失败的原因
通常LoadLibrary失败的原因大多是代码书写不规范,编写dll文件一般不是很难,但关键是在写dll的时候代码不规范,这样在调用时就有可可能出现这样那样的问题,出现LoadLibrary失败也就不足为怪了,为了保证你使用正确的调用规范,要通知编译器使用stdcall规范和/或使用在windows.h(及相关文件)中定义的常量,如WINAPI等。通常DLL的代码如下:
复制代码
WORD WINAPI vbShiftRight(WORD nValue, WORD nBits) { return (nValue >> nBits);}
下一步是与你在微软文档中读到的内容相反。你需要创建一个DEF文件。这是你防止输出函数名不出现乱字符的唯一方式(如_vbShiftRight@1)。DEF文件的形式如下:
复制代码
EXPORTS vbShiftRight
下一步是在VB中调用这个函数,使用以下声明:
复制代码
Declare Function vbShiftRight Lib "MYDLL.DLL" (ByVal nValue As Integer, ByValnBits As Integer) As Integer Sub Test() Dim i As Integer i = vbShiftRight(4,2) Debug.Assert i = 1 End Sub
如果你还想要更容易的方法从VB中调用,可以创建一个类型库。为此你需要创建和编译ODL(对象描述语言)文件。这个文件应该包含如下内容:
复制代码
module MyModule { [ helpstring("Shifts the bits of an integer to the right."),entry("vbShiftRight") ] short _stdcall vbShiftRight([in] short nValue, [in]short nBits); };
当VB加载DLL的类型库时,函数名和参数将出现在VB的对象浏览器中。此外,如果用户不输入正确的参数类型,VB将有可能产生LoadLibrary失败错误。
还有就是你最好用正确的方法调用dll,以下是我正常调用dll的函数:
复制代码
typedefvoid __declspec(dllimport)StartQueryForm(TDispatchConnection,TApplication); StartQueryForm* query;char buf[256]; if (!GetSystemDirectory(buf,256)) {Application->MessageBox("读取系统目录错误","错误",MB_OK+MB_ICONERROR); return ; }AnsiString sCmd=AnsiString(buf)+"\\QueryEnh.dll";
复制代码
HINSTANCE Package = LoadLibrary(sCmd.c_str()); if (Package) { try { query =(StartQueryForm )GetProcAddress((HINSTANCE)Package, "_StartQueryForm"); if(query) { TDispatchConnection conn=(MainForm->ConnectionWay==1 ?(TDispatchConnection)MainForm->dcomConnect:(TDispatchConnection)MainForm->sockConnect); query(conn,Application); } else{ AnsiString str="加载函数失败,失败原因:\r"; str+=SysErrorMessage(GetLastError());Application->MessageBox(str.c_str(),"错误",MB_OK+MB_ICONERROR); } } __finally {FreeLibrary(Package); } } else { AnsiString str="加载库失败,失败原因:\r";str+=SysErrorMessage(GetLastError());Application->MessageBox(str.c_str(),"´íÎó",MB_OK+MB_ICONERROR);
二、出现LoadLibrary失败解决办法
方式一:采用LoadLibraryEx
若DLL不在调用方的同一目录下,可以用LoadLibrary(L“DLL绝对路径”)加载。但若调用的DLL内部又调用另外一个DLL,此时调用仍会失败。
解决办法是用LoadLibraryEx:
LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。
方式二:采用SetCurrentDir
跨目录调用dll,你应该这样
1、用GetCurrentDir保存当前的工作目录
2、用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径
3、用LoadLibrary你的DLL
4、使用SetCurrentDir恢复到原来的工作路径
影音播放 149.5 MB
全民k歌是一款众多用户都在使用的唱歌、k歌app,深受大家的喜欢。该软件拥有海量的音乐资源,各种曲风应有尽有,音质效果清晰,支持多样玩法。你可以在这里与好友在线pk唱歌,尽情展示你的歌喉,还可以趣味调音、全屏
商务办公 21.53M
葱喵儿朗读软件是一款非常好用的儿童朗读app,从小班到小学的儿童均可使用,汇集了丰富的故事诗词等资源,专业老师纯正发音,欢迎喜爱的朋友到绿色资源网下载体验!官方介绍葱喵儿朗读,专为儿童设计的朗读学习软件。
商务办公 21.00M
全国恒大app恒房通网上购房平台是一款支持全国各省份销售员使用的售楼软件。本软件提供了楼盘发布、楼盘展示、房贷计算、订单处理等诸多功能,房产销售人员可以随时随地通过手机和客户洽谈,提高楼盘销售的成功率!快
系统工具 16.00 KB
安卓运营商修改器帮助安卓手机用户打造的手机修改器。用户可以通过此软件一键修改运营商、信号强度、电池百分比、网络名称,还可以自动以设置网络名称,有需要的用户可以下载使用。运营商修改插件介绍一键修改运营商
商务办公 71.5 MB
云上钢琴学生端app是给学生们使用的钢琴学习软件,这里提供了丰富的教学课程和名师讲解。针对性的学习模式,让学生能更加容易理解。通过软件来提升对钢琴的认知,有效的提升自己的演奏水平。云上钢琴学生版介绍云上钢
商务办公 30.6M
MyET为你提供多种外语学习课程,包括各种语法大全,从最基础开始逐步提升,教学内容丰富,也包含商业用语,所有课程可免费试用,所有客户端信息同步,方便使用。
资讯阅读 2.1M
爱去小说是款好用的小说阅读器,选择你喜爱的小说来进行阅读,不同的版块等着你来体验,一键搜索你需要的小说本地缓存,随时随地想看就看,自定义阅读界面千万不要错过,快来加入我们吧!
资讯阅读 9.0M
desire漫画app是款好用的漫画阅读器,快来选择不同的漫画进行阅读吧,细致的分类满足用户的需求,实时更新超前纯净体验,热门的榜单让你告别漫画荒,支持本地缓存免费体验!
商务办公 88 MB
央行数字人民币app最新版上线,最新的试点版适用于部分城市,这是央行为整合线上支付市场打造的手机钱包软件,支持目前大部分的银行,已经直接对接,绝对保障用户的财产安全,投资支付理财更加的方便!央行数字人民币
生活服务 16.27M
一键数据恢复软件免费版有着十分强大的功能,此软件专为安卓用户打造,大家在清理手机的过程中如果不小心删掉了重要的文件,就可以通过这个软件来进行找回,不管是本地的照片、音乐、视频还是其他文档,都可以帮你扫