2014/11/27 13:47:58作者:佚名来源:网络
有一网友在程序开发时写了一个dll文件,然后调用时出现LoadLibrary失败的情况,本小编通过网上搜集了一些有关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,
ByVal nBits 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的函数:
typedef void __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="加载函数失败,失败原因:\n\r";
str+=SysErrorMessage(GetLastError());
Application->MessageBox(str.c_str(),"错误",MB_OK+MB_ICONERROR);
}
}
__finally {
FreeLibrary(Package);
}
}
else
{
AnsiString str="加载库失败,失败原因:\n\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恢复到原来的工作路径
标签: 装载dll文件 LoadLibrary失败 解决办法
相关文章
够快云库v6.3.24.12120免费版
详情
光影魔术手官方版 v4.7.1
详情
ADsafe净网大师v5.4.408.7000
详情
网易邮箱大师v5.3.2.1015电脑版
详情
foxmailv7.2.25.375
详情
暴风影音5v5.92.0824.1111
详情
暴风影音v5.92.0824.1111
详情
BitComet(比特彗星)v2.13.4.13Beta2
详情
路由优化大师v4.5.31.267
详情
茄子快传电脑版 v5.1.0.7
详情
搜狐影音 v7.2.1.0官方版
详情
搜狐影音客户端 v7.2.1.0
详情
迅雷影音官方版 v7.0.3.92
详情
cbox央视影音v6.0.3.4经典版
详情
potplayer播放器v1.7.22496
详情
Daum PotPlayer(已集成直播源)v1.7.22496绿色纯净美化便携增强版
详情
NBA2K21曼巴永恒版v1.0中文
详情
赛博朋克2077v1.0中文
详情
天国拯救2黄金版 Build.17149332-1.1.1.11377中文版
详情
燕云十六声电脑版 v1.9.31
详情
潜行者2:切尔诺贝利之心 Build.16805297豪华中文版
详情
模拟农场25豪华中文版
详情
迷你世界电脑版 v1.41.00
详情
骑马与砍杀2 v1.2.9.34019免费版
详情
侠盗猎车手圣安地列斯 v1.0最新中文版
详情
整蛊白云 v1.0
详情
地平线4 v1.476中文版
详情
圣女战旗中文v1.1.9绿色免安装版
详情
狂怒2中文
详情
红色警戒2共和国之辉电脑版 v1.0
详情
模拟人生4 v1.0中文免费版
详情
蛊婆v1.0免费版
详情
冰封蜘蛛v1.0安卓版
详情
恐龙射击生存v1.0.0安卓版
详情
塔之少女v1.0.1安卓版
详情
无赖英雄v2.6.30安卓版
详情
风月读书v1.20.070219安卓版
详情
皮皮虾极速版appv3.6.2安卓版
详情
思尔健康v3.1.59安卓版
详情
小豆苗疫苗助手v8.3.5官方版
详情
京东极速版v1.2.0安卓版
详情
猫耳fmv6.5.4免付费版
详情
番茄畅听红包版v6.2.2.32安卓版
详情
网易蜗牛读书v1.9.9安卓最新版
详情
我的健身教练2单机版v2.0安卓版
详情
钢铁英雄(Heroes of Steel Elite)v4.5.21无限金币钻石版
详情
有声英语小说appv1.3.4去广告最新版
详情
造梦无双v1.02九游版
详情