—————-忠于实践,记录点滴———————
作者:yanxiangyfg
来源:http://blog.csdn.net/yanxiangyfg?viewmode=contents
说明:未经允许,拒绝转载
背景:
如果程序是在windows中使用,难免要使用DLL动态库,这里就记录下加载dll和使用dll中函数的方法。
demo原型:
//此demo功能:加载dll动态库,并使用dll动态库中函数
// 包含头文件
#if defined(_WIN32)
#include <windows.h>
#endif
//定义函数原型,和需要使用dll中函数类型一致
typedef void (*DefSetRunningVMName)(char* vmName);
void loadWindowsDll(void){
static bool isLoadedFlag = false;
static DefSetRunningVMName SetRunningVMName = NULL;
if(!isLoadedFlag){
HMODULE hinstLib = NULL;
//LoadLibrary函数加载dll库
hinstLib = LoadLibrary("VBoxTest.dll");
if(hinstLib == NULL)
{
LogRel(("Fail to LoadLibrary VBoxTest.dll"));
}else{
isLoadedFlag = true;
//从dll中获取需要使用的函数指针,通过GetProcAddress来实现
SetRunningVMName = (DefSetRunningVMName)GetProcAddress(hinstLib,"SetRunningVMName");
}
}
//调用上述获取的函数SetRunningVMName,参数为字符串,这里
if(NULL != SetRunningVMName){
SetRunningVMName(“testString”);
}
}
注意点:
1> GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址,即找到“SetRunningVMName”函数在VBoxTest.dll中的函数地址。 但是需要此函数已经在DLL库中导出符号。windows下导出符号使用如下方式:
VBoxTest.cpp中函数导出符号方法: extern “c” __declspec(dllexport)
extern "c" __declspec(dllexport) void SetRunningVMName(char* vmName)
{
//函数实体
}
2> GetProcAddress函数原型如下:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
此函数GetProcAddress返回值类型为FARPROC ,需要进行强制转换为定义函数类型,即转换为上述的“DefSetRunningVMName”函数定义,强转之后能能正常编译。