C++builder(Xe5)下加载VC动态库的两种方法

这里分为两种方式:静态加载和动态加载;

1、静态加载

满足条件:XXX.dll、XXX.lib(C++builder下进行转换后的lib文件)同时存在,并且有dll里面函数的声明的.h文件,这样基本条件就满足了。

VC下生成的lib文件再C++builder中不能直接调用,网上给出了两种方法见:C++ bulider 连接VC编译的lib库   其中第二种最好用:

操作如下:

1、生成C++ builder下能用的lib文件

<1>找到C++buider安装目录下(r如:D:\Program Files\Embarcadero\RAD Studio\12.0\bin)的implib工具,此工具可以将DLL文件生成C++buider下能用的lib文件, 在cmd下运行此工具,如:

C++builder(Xe5)下加载VC动态库的两种方法_第1张图片

这样就会在 C:\Users\Administrator\下生成XXX_demo.lib文件,这个lib文件是C++builder能用的。

<2>运行implib工具最简单的方法就是将implib工具的路径添加到系统环境变量中如:右键计算机->属性->工具系统设置->高级->环境变量,在“系统变量“的path中添加:D:\Program Files\Embarcadero\RAD Studio\12.0\bin,这样我们就可以直接运行implib了,如下:

C++builder(Xe5)下加载VC动态库的两种方法_第2张图片

这样也能生成lib文件。

有了上述准备,接下来我们只需在.h文件中加入:#pragma comment(lib, "XXX_demo.lib")

把XXX_demo.dll同执行文件(如exe文件)放到一起,就可以了!

 

2、动态加载

满足条件:XXX.dll文件、dll文件中函数的声明方式;

动态加载最具灵活性:并且不需要lib文件,等需要定义dll函数指针,具体步骤如下:

动态调用动态库步骤:
1、创建一个函数指针,其指针数据类型要与调用的DLL引出函数相吻合。
2、通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄。
3、通过Win32 API函数GetProcAddress()获取要调用的DLL的函数地址,把结果赋给自定义函数的指针类型。
4、使用函数指针来调用DLL函数。
5、最后调用完成后,通过Win32 API函数FreeLibrary()释放DLL函数。

举例如下:

如果在DLL中函数的什么如下:

1
2
int   __stdcall  login(feature_t feature_id, vendor_code_t vendor_code, handle_t *handle);
int   __stdcall  login_scope(feature_t feature_id,  const   char  *scope, vendor_code_t vendor_code, handle_t *handle);

那么可以在.h文件中声明函数指针如下:

1
2
typedef   int  ( __stdcall * LOGIN)(feature_t feature_id, vendor_code_t vendor_code, handle_t *handle);
typedef   int  ( __stdcall * LOGIN_SCOPE)(feature_t feature_id,  const   char  *scope, vendor_code_t vendor_code, handle_t *handle);

 

我们在需要用到DLL函数的地方声明如下:

1
2
LOGIN                 login;
LOGIN_SCOPE  longin_scope;

接下来加载DLL文件如下:

1
2
3
AnsiString m_dllFileName( "XXX_demo.dll" ); 
HINSTANCE m_hDll;
m_hDll = ::LoadLibraryA(m_dllFileName.c_str());

获取对应函数指针:

1
2
login       = (LOGIN)GetProcAddress(m_hDll,  "login" );
longin_scope    = (LOGIN_SCOPE)GetProcAddress(m_hDll, 
"longin_scope" );

之后就可以正常使用login 和longin_scope 函数了;

最后别忘了释放m_hdll如下:

1
2
::FreeLibrary(m_hDll);      
m_hDll =  NULL ;

至此,完成!!!

你可能感兴趣的:(C++builder之始)