这里分为两种方式:静态加载和动态加载;
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:\Users\Administrator\下生成XXX_demo.lib文件,这个lib文件是C++builder能用的。
<2>运行implib工具最简单的方法就是将implib工具的路径添加到系统环境变量中如:右键计算机->属性->工具系统设置->高级->环境变量,在“系统变量“的path中添加:D:\Program Files\Embarcadero\RAD Studio\12.0\bin,这样我们就可以直接运行implib了,如下:
这样也能生成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 ; |
至此,完成!!!