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失败 解决办法
相关文章
Adobe indesign cs6中文版
详情金山数据恢复大师官方版 v1.0.0.2
详情南方测绘Cass10v10.1.6中文
详情revit 2017
详情KeyShot Pro 9中文(附安装教程) v9.0.286
详情网易新闻客户端v105.3
详情AIMP4v5.11.2421中文绿色美化版
详情onekey一键还原v18.0.18.1008
详情浩辰CAD2020绿色v20.0
详情好图网图标转换工具v4.9.7
详情aardiov35.0.0中文最新版
详情Adobe Creative Cloud 2024简体中文v5.3.0.48
详情暴风影音16 v9.04.1029去广告精简版
详情ASP.NET Maker 2019(ASP.NET代码生成工具)v12.0.4.0
详情暴风影音v5.92.0824.1111
详情迅雷5稳定版v5.8.14.706
详情使命召唤17官方中文版 v1.0
详情死亡之雨新的僵尸病毒中文v1.0绿色免安装版
详情辐射4v1.7.15.0整合版
详情克莉2v1.0中文版
详情冬日计划v1.2中文版
详情刺客信条英灵殿v1.0吾爱
详情刺客信条英灵殿终极v1.0免安装
详情动物森友会v1.10.0最新
详情哈迪斯杀出地狱v1.37中文
详情嗜血印中文豪华版v1.0豪华版 附游戏攻略秘籍
详情城市战斗v1.0中文
详情尼尔人工生命v1.0steam免费
详情尼尔人工生命升级版v1.0PC
详情层层恐惧2中文v1.0绿色免安装版
详情往日不再v1.0 steam
详情往日不再v1.0pc
详情小生活游戏内置MOD版v2.0(57)安卓版
详情使命召唤手游测试服最新版v1.9.41安卓版
详情三国谋定天下官服v1.2.1安卓版
详情热血新手村高爆版v1.0.0安卓版
详情我养你啊手机版v1.0.0安卓版
详情看懂了就很恐怖的故事(细思极恐)中文版v1.0安卓版
详情背包英雄中文手机版v1.1.1安卓版
详情glow官方版v2.0.9安卓版
详情三国大时代4霸王立志官方正版v1.9安卓版
详情飞卢小说阅读器手机版v7.0.7安卓版
详情牛牛粤语词典软件v20.4.4安卓版
详情PrettyUp视频美化瘦身软件v2.3.0
详情化学方程式app中文版v1.1.0.20安卓版
详情地下城堡3魂之诗2024安卓最新版v1.2.3安卓版
详情南方都市报v6.10.0安卓版
详情阿修罗之眼正版v1.0.10安卓版
详情