您的位置:首页 > 其它

demo集合第1弹:加载windows dll库,并使用dll中函数的方法

2016-12-16 18:25 495 查看
—————-忠于实践,记录点滴———————

作者: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”函数定义,强转之后能能正常编译。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows 函数 dll