係統之家 - 係統光盤下載網站!

當前位置:係統之家 > 係統教程 > 其它教程 > 詳細頁麵

裝載dll文件提示“LoadLibrary失敗”怎麽解決?

時間:2017-11-04 來源:係統之家 作者:chunhua

  裝載dll文件提示“LoadLibrary失敗”怎麽解決?一用戶在開發程序時寫了一個dll文件,但是在調用dll文件時出錯了,提示“LoadLibrary failed with error126:找不到指定的模塊。”,這是怎麽回事呢?下麵小編給大家分析出現LoadLibrary失敗的原因及解決辦法。

裝載dll文件提示“LoadLibrary失敗”怎麽解決?

  一、出現LoadLibrary失敗的原因

  通常LoadLibrary失敗的原因大多是代碼書寫不規範,編寫dll文件一般不是很難,但關鍵是在寫dll的時候代碼不規範,這樣在調用時就有可可能出現這樣那樣的問題,出現LoadLibrary失敗也就不足為怪了,為了保證你使用正確的調用規範,要通知編譯器使用stdcall規範和/或使用在windows.h(及相關文件)中定義的常量,如WINAPI等。通常DLL的代碼如下:

  1. 01WORD WINAPI vbShiftRight(WORD nValue, WORD nBits)
  2. 02{
  3. 03return (nValue >> nBits);
  4. 04}
複製代碼
WORD WINAPI vbShiftRight(WORD nValue, WORD nBits) { return (nValue >> nBits); }

  下一步是與你在微軟文檔中讀到的內容相反。你需要創建一個DEF文件。這是你防止輸出函數名不出現亂字符的唯一方式(如_vbShiftRight@1)。DEF文件的形式如下:

  1. 01EXPORTS
  2. 02vbShiftRight
複製代碼
EXPORTS vbShiftRight

  下一步是在VB中調用這個函數,使用以下聲明:

  1. 01Declare Function vbShiftRight Lib "MYDLL.DLL" (ByVal nValue As Integer,
  2. 02ByVal nBits As Integer)
  3. 03As Integer
  4. 04Sub Test()
  5. 05Dim i As Integer
  6. 06i = vbShiftRight(4, 2)
  7. 07Debug.Assert i = 1
  8. 08End Sub
複製代碼
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(對象描述語言)文件。這個文件應該包含如下內容:

  1. 01module MyModule {
  2. 02[
  3. 03helpstring("Shifts the bits of an integer to the right."),
  4. 04entry("vbShiftRight")
  5. 05]
  6. 06short _stdcall vbShiftRight([in] short nValue, [in] short nBits);
  7. 07};
複製代碼
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的函數:

  1. 01typedef void __declspec(dllimport) StartQueryForm(TDispatchConnection*,TApplication*);
  2. 02StartQueryForm* query;
  3. 03char buf[256];
  4. 04if (!GetSystemDirectory(buf,256)) {
  5. 05Application->MessageBox("讀取係統目錄錯誤","錯誤",MB_OK+MB_ICONERROR);
  6. 06return ;
  7. 07}
  8. 08AnsiString sCmd=AnsiString(buf)+"\\QueryEnh.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";
  1. 01HINSTANCE Package = LoadLibrary(sCmd.c_str());
  2. 02if (Package)
  3. 03{
  4. 04try {
  5. 05query = (StartQueryForm *)GetProcAddress((HINSTANCE)Package, "_StartQueryForm");
  6. 06if (query) {
  7. 07TDispatchConnection* conn=(MainForm->ConnectionWay==1 ?
  8. 08(TDispatchConnection*)MainForm->dcomConnect:
  9. 09(TDispatchConnection*)MainForm->sockConnect);
  10. 10query(conn,Application);
  11. 11}
  12. 12else {
  13. 13AnsiString str="加載函數失敗,失敗原因:\n\r";
  14. 14str+=SysErrorMessage(GetLastError());
  15. 15Application->MessageBox(str.c_str(),"錯誤",MB_OK+MB_ICONERROR);
  16. 16}
  17. 17}
  18. 18__finally {
  19. 19FreeLibrary(Package);
  20. 20}
  21. 21}
  22. 22else
  23. 23{
  24. 24AnsiString str="加載庫失敗,失敗原因:\n\r";
  25. 25str+=SysErrorMessage(GetLastError());
  26. 26Application->MessageBox(str.c_str(),"´íÎó",MB_OK+MB_ICONERROR);
複製代碼
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失敗”的原因及解決辦法,有遇到此錯誤提示的夥伴,可以參考上文解決。

分享到:

係統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門係統下載