背景:
如果程序是在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”函数定义,强转之后能能正常编译。