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

—————-忠于实践,记录点滴———————
作者: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”函数定义,强转之后能能正常编译。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值