zoukankan      html  css  js  c++  java
  • 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 中的全局变量本身而不是其地址了。

    转载请注明出处:http://www.cnblogs.com/ygdblogs
  • 相关阅读:
    【C++】链表回环检测
    【C++】满二叉树问题
    【C++】约瑟夫环(数组+链表)
    【C++】子序列匹配问题
    【OJ】抓牛问题
    【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)
    【C++】二叉树的构建、前序遍历、中序遍历
    范进中Nature——儒林外史新义
    VMware Workstation下ubuntu虚拟机无法上网连不上网络解决
    儒林外史人物——娄三、娄四公子
  • 原文地址:https://www.cnblogs.com/ygdblogs/p/5382699.html
Copyright © 2011-2022 走看看