?? bcb_a9.htm
字號:
<html>
<head>
<title>C++Builder中動態庫的鏈接問題</title>
<meta http-equiv="目錄類型" content="文本/html; 字符集=gb2312">
</head>
<body bgcolor="#FFFFFF">
<table width="100%" border="0" height="285">
<tr>
<td height="35">
<div align="center" class="p14"><font color="#000000">C++Builder中動態庫的鏈接問題</font></div>
</td>
</tr>
<tr valign="top">
<td>
<p align=center><strong><font color="#000000">謝偉成、王斌</font></strong></p>
<p><font color="#000000"> 動態庫鏈接到應用程序中主要有兩種方式:隱式鏈接和顯式鏈接。隱式<br>
鏈接是常用方式。<br>
<br>
如果應用程序和動態庫是分別在不同開發平臺上編制的,動態庫的導入<br>
庫(lib文件)可能會與應用程序的開發平臺所要求的導入庫格式不相容,從而在應用程序與動態庫隱式鏈接時,出現程序鏈接錯誤:contains invalid
OMF record。例如在C++Builder開發平臺上鏈接Visual C++制作的動態庫時,就會出現上述的錯誤。解決這一問題,可以采用兩種方法:顯式連接法和使用C++Builder中提供的導入庫生成工具。<br>
<br>
顯式連接:顯式連接不需要在工程中加入導入庫和相應的頭文件,只需要把動態庫放入指定的目錄下。在應用程序中通過函數調用顯式的裝載和卸掉DLL,通過函數指針來調用DLL的導出函數。<br>
<br>
步驟:<br>
<br>
1. 調用LoadLibrary函數裝載DLL并得到模塊句柄;<br>
<br>
2. 調用GetProcAddress函數獲取指定導出函數的指針;<br>
<br>
3. 用這個函數的指針調用該函數;<br>
<br>
4. 使用完畢后,用FreeLibrary釋放DLL。<br>
<br>
例子:<br>
<br>
用VC++制作一個動態庫:<br>
<br>
選new→Project→Win32—Dynamic—Link Library,加入addit.cpp<br>
<br>
extern ″C″<br>
<br>
{ void —declspec( dllexport ) addit(int a, int b, int *c)<br>
<br>
{ *c = a + b; <br>
<br>
}<br>
<br>
}<br>
<br>
addit.h<br>
<br>
extern ″C″<br>
<br>
{void addit(int a, int b, int *c);}<br>
<br>
編譯鏈接生成addit.dll和addit.lib。在C++Builder程序中調用addit函數。<br>
<br>
C++Builder程序中:<br>
<br>
{HINSTANCE handle; //DLLa模塊的句柄<br>
<br>
FARPROC lpFarProc; <br>
<br>
void (*lpaddit)(int,int,int *);<br>
<br>
//指向addit函數的指針<br>
<br>
int ntemp;<br>
<br>
handle = LoadLibrary(″addit.dll″); <br>
<br>
//裝載addit.dll, 得到該庫句柄<br>
<br>
//addit.dll位于當前目錄下<br>
<br>
lpFarProc = GetProcAddress(handle,″addit″); <br>
<br>
//得到指向函數addit的指針<br>
<br>
lpaddit = (void(—cdecl *)(int, int, int *))lpFarProc; //指針類型轉換<br>
<br>
lpaddit(2,3,&ntemp); //使用addit函數<br>
<br>
FreeLibrary(handle); <br>
<br>
//將addit.dll從程序中卸掉<br>
<br>
}<br>
<br>
此程序在VC++ 5.0 和C++Builder 3.0下通過。<br>
<br>
使用C++Builder中提供的導入庫生成工具:先預處理,后隱式鏈接。<br>
<br>
步驟:<br>
<br>
1.用C++Builder提供的implib.exe工具重新生成該動態庫(xxx.dll)的導入庫(xxx.lib)。命令如下:<br>
<br>
implib addit.lib addit.dll。<br>
<br>
addit.dll為已有動態庫,addit.lib為要生成的導入庫。由此生成的導入庫addit.lib格式與C++Builder開發平臺是相容的;<br>
<br>
2.在動態庫的頭文件addit.h中,對其輸出函數重新說明,語句如下:<br>
<br>
extern —stdcall void addit( int a, int b, int *c);<br>
<br>
3.然后采用隱式鏈接法,將重新生成的導入庫(addit.lib)和重新說明的頭文件(addit.h)加入到C++Builder應用程序的工程項目中,進行編譯和連接。<br>
<br>
addit.dll按上述步驟操作,在VC++ 5.0 和C++Builder 3.0下通過。<br>
</font>
</p>
</td>
</tr>
</table>
<br>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -