人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁(yè)面

裝載dll文件時(shí)出現(xiàn)LoadLibrary失敗的因素及處理辦法

裝載dll文件時(shí)出現(xiàn)LoadLibrary失敗的因素及處理辦法

更新時(shí)間:2023-06-12 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

編程(Programming)是編定程序的中文簡(jiǎn)稱,就是讓計(jì)算機(jī)代碼解決某個(gè)問(wèn)題,對(duì)某個(gè)計(jì)算體系規(guī)定一定的運(yùn)算方式,使計(jì)算體系按照該計(jì)算方式運(yùn)行,并最終得到相應(yīng)結(jié)果的過(guò)程。為了使計(jì)算機(jī)能夠理解(understand)人的意圖,人類就必須將需解決的問(wèn)題的思路、方法和手段通過(guò)計(jì)算機(jī)能夠理解的形式告訴計(jì)算機(jī),使得計(jì)算機(jī)能夠根據(jù)人的指令一步一步去工作,完成某種特定的任務(wù)。這種人和計(jì)算體系之間交流的過(guò)程就是編程。

有一網(wǎng)友在程序開發(fā)時(shí)寫了一個(gè)dll文件,然后調(diào)用時(shí)出現(xiàn)LoadLibrary失敗的情況,本小編通過(guò)網(wǎng)上搜集了一些有關(guān)LoadLibrary失敗的原因及解決方法,希望對(duì)有需要的朋友有所幫助。
LoadLibrary失敗
一、出現(xiàn)LoadLibrary失敗的原因
通常LoadLibrary失敗的原因大多是代碼書寫不規(guī)范,編寫dll文件一般不是很難,但關(guān)鍵是在寫dll的時(shí)候代碼不規(guī)范,這樣在調(diào)用時(shí)就有可可能出現(xiàn)這樣那樣的問(wè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è)類型庫(kù)。為此你需要?jiǎng)?chuàng)建和編譯ODL(對(duì)象描述語(yǔ)言)文件。這個(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的類型庫(kù)時(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";


  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="加載庫(kù)失敗,失敗原因:\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);
通過(guò)指定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ù)到原來(lái)的工作路徑


使用編程語(yǔ)言寫的程序,由于每條指令都對(duì)應(yīng)計(jì)算機(jī)一個(gè)特定的基本動(dòng)作,所以程序占用內(nèi)存少、執(zhí)行效率高。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 通河县| 保定市| 甘孜县| 六安市| 怀来县| 新乡县| 正镶白旗| 天峨县| 嘉义县| 攀枝花市| 吉木乃县| 饶河县| 武隆县| 嘉定区| 墨玉县| 黑山县| 昌江| 安泽县| 乌兰县| 洛阳市| 沙洋县| 宜川县| 桑日县| 建平县| 江油市| 泽普县| 天门市| 三亚市| 齐齐哈尔市| 荔波县| 宣汉县| 新巴尔虎右旗| 乌海市| 安新县| 镇巴县| 苏尼特右旗| 长寿区| 黎城县| 临澧县| 东宁县| 沂源县|