當前位置:軟件學堂 > 資訊首頁 > 網絡編程 > 編程其他 > 裝載dll文件時出現LoadLibrary失敗的原因及解決辦法

裝載dll文件時出現LoadLibrary失敗的原因及解決辦法

2014/11/27 13:47:58作者:佚名來源:網絡

移動端

有一網友在程序開發時寫了一個dll文件,然后調用時出現LoadLibrary失敗的情況,本小編通過網上搜集了一些有關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失敗  解決辦法    

欧美一级一极性活片免费观看,欧美一级艳片欧美精品,欧美一级性爱大片,欧美一级囗交视频 视频,欧美一级特黄录像视频