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

151次阅读
没有评论

共计 1152 个字符,预计需要花费 3 分钟才能阅读完成。

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

正文完
 
admin
版权声明:本站原创文章,由 admin 2022-03-23发表,共计1152字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码