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失敗 解決辦法
相關文章
ip雷達 v5.0.2綠色版
詳情WinSCPv5.15.1綠色中文版
詳情filezilla client v5.5
詳情wireshark中文版 v3.4.9
詳情Boson Netsimv10.8
詳情風行播放器 v3.0.6.106
詳情愛奇藝客戶端 v10.1.0.6636官方版
詳情搜狐影音 v7.0.19.0官方版
詳情樂視視頻 v7.3.2.192
詳情華數tv客戶端PC版 v1.1.2.0
詳情cbox央視影音 v5.1.2.1經典版
詳情軟媒收音機(魔方) v1.13
詳情傾聽網絡收音機 v3.0.0.0
詳情魅影流聲全球網絡收音機 v1.0.0.1
詳情酷狗電臺 v8.2.75
詳情暴龍網絡收音機 v2.5.1
詳情克莉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
詳情救贖之路v1.0中文
詳情斯蓋爾女仆v1.0中文
詳情月風魔傳不死之月v1.0中文
詳情qooapp最新版v8.3.31安卓版
詳情speedtest測速appv5.0.9安卓版
詳情小度音箱appv4.13.0.100安卓版
詳情pubgtool畫質助手安卓版v1.0.7.8安卓版
詳情怪談之家正版官方版v2.9.40安卓版
詳情智慧中小學免費教育平臺appv6.7.9安卓版
詳情智慧中小學網課免費平臺appv6.7.9安卓版
詳情光環助手游戲盒v5.29.2安卓版
詳情崩壞3星穹鐵道v6.9.0安卓版
詳情gg修改器中文版v0.1.9安卓版
詳情易車網appv10.95.1安卓版
詳情迷你世界最新版v1.28.6安卓版
詳情太空行動體驗服v1.44.11.001安卓版
詳情qooapp正版v8.3.31安卓版
詳情我養你啊游戲v1.0.0安卓版
詳情remini照片修復v3.7.327.202255164安卓版
詳情