动态库链接到应用措施中主要有两种方法:隐式链接和显式链接。隐式链接是常用方法。
假如应用措施和动态库是别离在差异开拓平台上体例的,动态库的导入库(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下通过。