VC DLL 动态链接库(三)

  DLL 导出变量

  DLL 定义的全局变量可以被调用的进程访问, DLL 也可以访问调用进程的全局数据, 我们来看看在应用工程中引用 DLL 中的变量

// lib.h
#ifnedef LIB_H
#define LIB_H
extern int dllGlobalVar;

#endif
// lib.cpp
#include "lib.h"
#inlclude <windows.h>

int dllGlobalVar;

BOOL APLENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
    switch(ul_reason_for_call){
        case DLL_PROCESS_ATTACH: dllGlobalVar = 100;break;
        caes DLL_THREAD_ATTACH:
        caes DLL_THREAD_DETACH:
        caes DLL_PROCESS_DETACH: break;
    }
    return TRUE;
}
// lib.def
LIBRARY "dllTest"
EXPORTS dllGlobalVar CONSTANT;
GetGlobalVar

  从 lib.h 和 lib.cpp 中可以看出, 全局变量在 DLL 中定义和使用方法与一般程序设计是一样的。

  下面在主函数中引用 DLL 中定义的全局变量

// test.cpp
#include <iostream>
#pragma comment(lib, "dllTest.lib")
extern int dllGlobalVar;

int main(){
    cout << *(int *)dllGlobalVar << endl;
    *(int *)dllGlobalVar = 1;
    cout << *(int *)dllGlobalVar << endl;

    return 0;
}

  其中需要注意的是用 extern int dllGlobalVar; 导入的并不是 DLL 中全局变量本身, 而是其地址, 使用强制指针转换来使用 DLL 中的全局变量, 所以千万不要有像这样的操作:dllGlobalVar = 1;

  这改变了指针的值, 以后再也引用不到 DLL 中的全局变量了。

 

  而还有一种更好的方法:

// test.cpp
#include <iostream>
#pragma comment(lib, "dllTest.lib")
extern int _declspec(dllimport) dllGlobalVar; // 用 _declspec(dllimport) 导入

int main(){
    cout << *(int *)dllGlobalVar << endl;
    dllGlobalVar = 1; // 这里就可以直接使用, 无需强制指针转换
    cout << *(int *)dllGlobalVar << endl;

    return 0;
}

  通过 _declspec(dllimport) 导入的就是 DLL 中的全局变量本身而不是其地址了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值