動態(tài)庫鏈接到應(yīng)用程序中主要有兩種方式:隱式鏈接和顯式鏈接。隱式鏈接是常用方式。
如果應(yīng)用程序和動態(tài)庫是分別在不同開發(fā)平臺上編制的,動態(tài)庫的導(dǎo)入庫(lib文件)可能會與應(yīng)用程序的開發(fā)平臺所要求的導(dǎo)入庫格式不相容,從而在應(yīng)用程序與動態(tài)庫隱式鏈接時,出現(xiàn)程序鏈接錯誤:contains invalid OMF record。例如在C++Builder開發(fā)平臺上鏈接Visual C++制作的動態(tài)庫時,就會出現(xiàn)上述的錯誤。解決這一問題,可以采用兩種方法:顯式連接法和使用C++Builder中提供的導(dǎo)入庫生成工具。
顯式連接:顯式連接不需要在工程中加入導(dǎo)入庫和相應(yīng)的頭文件,只需要把動態(tài)庫放入指定的目錄下。在應(yīng)用程序中通過函數(shù)調(diào)用顯式的裝載和卸掉DLL,通過函數(shù)指針來調(diào)用DLL的導(dǎo)出函數(shù)。
步驟:
1. 調(diào)用LoadLibrary函數(shù)裝載DLL并得到模塊句柄;
2. 調(diào)用GetProcAddress函數(shù)獲取指定導(dǎo)出函數(shù)的指針;
3. 用這個函數(shù)的指針調(diào)用該函數(shù);
4. 使用完畢后,用FreeLibrary釋放DLL。
例子:
用VC++制作一個動態(tài)庫:
選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);} |
C++Builder程序中: { |
此程序在VC++ 5.0 和C++Builder 3.0下通過。
使用C++Builder中提供的導(dǎo)入庫生成工具:先預(yù)處理,后隱式鏈接。
步驟:
1.用C++Builder提供的implib.exe工具重新生成該動態(tài)庫(xxx.dll)的導(dǎo)入庫(xxx.lib)。命令如下:
implib addit.lib addit.dll.
addit.dll為已有動態(tài)庫,addit.lib為要生成的導(dǎo)入庫。由此生成的導(dǎo)入庫addit.lib格式與C++Builder開發(fā)平臺是相容的;
2.在動態(tài)庫的頭文件addit.h中,對其輸出函數(shù)重新說明,語句如下:
extern __stdcall void addit( int a, int b, int *c);
3.然后采用隱式鏈接法,將重新生成的導(dǎo)入庫(addit.lib)和重新說明的頭文件(addit.h)加入到C++Builder應(yīng)用程序的工程項目中,進(jìn)行編譯和連接。
addit.dll按上述步驟操作,在VC++ 5.0 和C++Builder 3.0下通過。