• 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
  • 相关阅读:
    网络流(平面图转对偶图)
    666
    期望总结
    docker-1-简介
    22、整合mybatis
    21、整合Druid数据源
    20、Springboot 与数据访问(JDBC/自动配置)
    19、配置嵌入式servlet容器(下)
    18、配置嵌入式servlet容器(2)
    17、配置嵌入式servlet容器(1)
  • 原文地址:https://www.cnblogs.com/ygdblogs/p/5382699.html
Copyright © 2020-2023  润新知