2014/11/27 13:47:58作者:佚名來源:網(wǎng)絡(luò)
有一網(wǎng)友在程序開發(fā)時寫了一個dll文件,然后調(diào)用時出現(xiàn)LoadLibrary失敗的情況,本小編通過網(wǎng)上搜集了一些有關(guān)LoadLibrary失敗的原因及解決方法,希望對有需要的朋友有所幫助。
一、出現(xiàn)LoadLibrary失敗的原因
通常LoadLibrary失敗的原因大多是代碼書寫不規(guī)范,編寫dll文件一般不是很難,但關(guān)鍵是在寫dll的時候代碼不規(guī)范,這樣在調(diào)用時就有可可能出現(xiàn)這樣那樣的問題,出現(xiàn)LoadLibrary失敗也就不足為怪了,為了保證你使用正確的調(diào)用規(guī)范,要通知編譯器使用stdcall規(guī)范和/或使用在windows.h(及相關(guān)文件)中定義的常量,如WINAPI等。通常DLL的代碼如下:
WORD WINAPI vbShiftRight(WORD nValue, WORD nBits)
{
return (nValue >> nBits);
}
下一步是與你在微軟文檔中讀到的內(nèi)容相反。你需要創(chuàng)建一個DEF文件。這是你防止輸出函數(shù)名不出現(xiàn)亂字符的唯一方式(如_vbShiftRight@1)。DEF文件的形式如下:
EXPORTS
vbShiftRight
下一步是在VB中調(diào)用這個函數(shù),使用以下聲明:
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中調(diào)用,可以創(chuàng)建一個類型庫。為此你需要創(chuàng)建和編譯ODL(對象描述語言)文件。這個文件應(yīng)該包含如下內(nèi)容:
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的類型庫時,函數(shù)名和參數(shù)將出現(xiàn)在VB的對象瀏覽器中。此外,如果用戶不輸入正確的參數(shù)類型,VB將有可能產(chǎn)生LoadLibrary失敗錯誤。
還有就是你最好用正確的方法調(diào)用dll,以下是我正常調(diào)用dll的函數(shù):
typedef void __declspec(dllimport) StartQueryForm(TDispatchConnection*,TApplication*);
StartQueryForm* query;
char buf[256];
if (!GetSystemDirectory(buf,256)) {
Application->MessageBox("讀取系統(tǒng)目錄錯誤","錯誤",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="加載函數(shù)失敗,失敗原因:\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);
二、出現(xiàn)LoadLibrary失敗解決辦法
方式一 采用LoadLibraryEx
若DLL不在調(diào)用方的同一目錄下,可以用LoadLibrary(L"DLL絕對路徑")加載。但若調(diào)用的DLL內(nèi)部又調(diào)用另外一個DLL,此時調(diào)用仍會失敗。解決辦法是用LoadLibraryEx:
LoadLibraryEx("DLL絕對路徑", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通過指定LOAD_WITH_ALTERED_SEARCH_PATH,讓系統(tǒng)DLL搜索順序從DLL所在目錄開始。
方式二 采用SetCurrentDir
跨目錄調(diào)用dll,你應(yīng)該這樣
1 用GetCurrentDir保存當前的工作目錄
2 用SetCurrentDir將當前的工作目錄,設(shè)置為你的DLL所在的路徑,需要使用絕對路徑
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢復(fù)到原來的工作路徑
標簽: 裝載dll文件 LoadLibrary失敗 解決辦法
相關(guān)文章
Adobe indesign cs6中文版
詳情金山數(shù)據(jù)恢復(fù)大師官方版 v1.0.0.2
詳情南方測繪Cass10v10.1.6中文
詳情revit 2017
詳情KeyShot Pro 9中文(附安裝教程) v9.0.286
詳情網(wǎng)易新聞客戶端v105.3
詳情AIMP4v5.11.2421中文綠色美化版
詳情onekey一鍵還原v18.0.18.1008
詳情浩辰CAD2020綠色v20.0
詳情好圖網(wǎng)圖標轉(zhuǎn)換工具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穩(wěn)定版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豪華版 附游戲攻略秘籍
詳情城市戰(zhàn)斗v1.0中文
詳情尼爾人工生命v1.0steam免費
詳情尼爾人工生命升級版v1.0PC
詳情層層恐懼2中文v1.0綠色免安裝版
詳情往日不再v1.0 steam
詳情往日不再v1.0pc
詳情小生活游戲內(nèi)置MOD版v2.0(57)安卓版
詳情使命召喚手游測試服最新版v1.9.41安卓版
詳情三國謀定天下官服v1.2.1安卓版
詳情熱血新手村高爆版v1.0.0安卓版
詳情我養(yǎng)你啊手機版v1.0.0安卓版
詳情看懂了就很恐怖的故事(細思極恐)中文版v1.0安卓版
詳情背包英雄中文手機版v1.1.1安卓版
詳情glow官方版v2.0.9安卓版
詳情三國大時代4霸王立志官方正版v1.9安卓版
詳情飛盧小說閱讀器手機版v7.0.7安卓版
詳情牛?;浾Z詞典軟件v20.4.4安卓版
詳情PrettyUp視頻美化瘦身軟件v2.3.0
詳情化學(xué)方程式app中文版v1.1.0.20安卓版
詳情地下城堡3魂之詩2024安卓最新版v1.2.3安卓版
詳情南方都市報v6.10.0安卓版
詳情阿修羅之眼正版v1.0.10安卓版
詳情