很多用戶在使用開發(fā)程序?qū)慏LL文件時(shí)可能都遇到過“LoadLibrary failed with error126:找不到指定的模塊。”的錯(cuò)誤提示,這是怎么回事呢?有什么方法可以解決這個(gè)問題呢?下面就跟小編一起來看看寫DLL文件失敗顯示找不到指定的模塊怎么解決的教程。
一、出現(xiàn)LoadLibrary失敗的原因
通常LoadLibrary失敗的原因大多是代碼書寫不規(guī)范,編寫dll文件一般不是很難,但關(guān)鍵是在寫dll的時(shí)候代碼不規(guī)范,這樣在調(diào)用時(shí)就有可可能出現(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)容相反。你需要?jiǎng)?chuàng)建一個(gè)DEF文件。這是你防止輸出函數(shù)名不出現(xiàn)亂字符的唯一方式(如_vbShiftRight@1)。DEF文件的形式如下:
EXPORTS
vbShiftRight
下一步是在VB中調(diào)用這個(gè)函數(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)建一個(gè)類型庫。為此你需要?jiǎng)?chuàng)建和編譯ODL(對(duì)象描述語言)文件。這個(gè)文件應(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);
};
當(dāng)VB加載DLL的類型庫時(shí),函數(shù)名和參數(shù)將出現(xiàn)在VB的對(duì)象瀏覽器中。此外,如果用戶不輸入正確的參數(shù)類型,VB將有可能產(chǎn)生LoadLibrary失敗錯(cuò)誤。
還有就是你最好用正確的方法調(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)目錄錯(cuò)誤","錯(cuò)誤",MB_OK+MB_ICONERROR);
return ;
}
AnsiString sCmd=AnsiString(buf)+"\\QueryEnh.dll";
復(fù)制代碼
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(),"錯(cuò)誤",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絕對(duì)路徑”)加載。但若調(diào)用的DLL內(nèi)部又調(diào)用另外一個(gè)DLL,此時(shí)調(diào)用仍會(huì)失敗。
解決辦法是用LoadLibraryEx:
LoadLibraryEx("DLL絕對(duì)路徑", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通過指定LOAD_WITH_ALTERED_SEARCH_PATH,讓系統(tǒng)DLL搜索順序從DLL所在目錄開始。
方式二:采用SetCurrentDir
跨目錄調(diào)用dll,你應(yīng)該這樣
1、用GetCurrentDir保存當(dāng)前的工作目錄
2、用SetCurrentDir將當(dāng)前的工作目錄,設(shè)置為你的DLL所在的路徑,需要使用絕對(duì)路徑
3、用LoadLibrary你的DLL
4、使用SetCurrentDir恢復(fù)到原來的工作路徑
以上就是寫DLL文件失敗顯示找不到指定的模塊怎么解決的教程,一般有問題都可以在網(wǎng)上查找解決方法,有需要的用戶可以保存這篇教程。更多教程請(qǐng)繼續(xù)關(guān)注
白云幫助中心。