程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++Builder中動態庫的鏈接問題

C++Builder中動態庫的鏈接問題

編輯:關於C++

動態庫鏈接到應用程序中主要有兩種方式:隱式鏈接和顯式鏈接。隱式鏈接是常用方式。

如果應用程序和動態庫是分別在不同開發平台上編制的,動態庫的導入庫(lib文件)可能會與應用程序的開發平台所要求的導入庫格式不相容,從而在應用程序與動態庫隱式鏈接時,出現程序鏈接錯誤:contains invalid OMF record。例如在C++Builder開發平台上鏈接Visual C++制作的動態庫時,就會出現上述的錯誤。解決這一問題,可以采用兩種方法:顯式連接法和使用C++Builder中提供的導入庫生成工具。

顯式連接:顯式連接不需要在工程中加入導入庫和相應的頭文件,只需要把動態庫放入指定的目錄下。在應用程序中通過函數調用顯式的裝載和卸掉DLL,通過函數指針來調用DLL的導出函數。

步驟:

1. 調用LoadLibrary函數裝載DLL並得到模塊句柄;

2. 調用GetProcAddress函數獲取指定導出函數的指針;

3. 用這個函數的指針調用該函數;

4. 使用完畢後,用FreeLibrary釋放DLL。

例子:

用VC++制作一個動態庫:

選new→Project→Win32—Dynamic—Link Library,加入addit.cpp

  extern ″C″
   {
   void __declspec( dllexport ) addit(int a, int b, int *c)
   {
    *c = a + b;
   }
   }
   addit.h
   extern ″C″
   {void addit(int a, int b, int *c);}

編譯鏈接生成addit.dll和addit.lib。在C++Builder程序中調用addit函數。

C++Builder程序中:

  {
   HINSTANCE handle; //DLLa模塊的句柄
  FARPROC lpFarProc;
   void (*lpaddit)(int,int,int *);//指向addit函數的指針
   int ntemp;
   handle = LoadLibrary(″addit.dll″); //裝載addit.dll, 得到該庫句柄 addit.dll位於當前目錄下
   lpFarProc = GetProcAddress(handle,″addit″);   //得到指向函數addit的指針
   lpaddit = (void(__cdecl *)(int, int, int *))lpFarProc; //指針類型轉換
   lpaddit(2,3,&ntemp); //使用addit函數
   FreeLibrary(handle); //將addit.dll從程序中卸掉
   }

此程序在VC++ 5.0 和C++Builder 3.0下通過。

使用C++Builder中提供的導入庫生成工具:先預處理,後隱式鏈接。

步驟:

1.用C++Builder提供的implib.exe工具重新生成該動態庫(xxx.dll)的導入庫(xxx.lib)。命令如下:

implib addit.lib addit.dll。

addit.dll為已有動態庫,addit.lib為要生成的導入庫。由此生成的導入庫addit.lib格式與C++Builder開發平台是相容的;

2.在動態庫的頭文件addit.h中,對其輸出函數重新說明,語句如下:

extern __stdcall void addit( int a, int b, int *c);

3.然後采用隱式鏈接法,將重新生成的導入庫(addit.lib)和重新說明的頭文件(addit.h)加入到C++Builder應用程序的工程項目中,進行編譯和連接。

addit.dll按上述步驟操作,在VC++ 5.0 和C++Builder 3.0下通過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved