zoukankan      html  css  js  c++  java
  • VC++ 静态DLL模板-全局变量

    1、VS2003新建DLL项目dllTest

    2、项目dllTest中添加脚本lib.h,代码如下:

     1 #ifndef LIB_H
     2 #define LIB_H
     3 extern int dllGlobalVar;
     4 extern "C" int GetGlobalVar();
     5 extern "C" void SetGlobalVar(int value);
     6 //为了验证全局的字符变量定义导出dllGlobalStr
     7 extern char *dllGlobalStr;
     8 extern "C" char *GetGlobalStr();
     9 extern "C" void SetGlobalStr(char *value,int iLen);
    10 #endif 

    3、项目dllTest中添加脚本lib.cpp,代码如下:

     1 #include "lib.h"
     2 #include <windows.h>
     3 #include <string.h>
     4  
     5 int dllGlobalVar;
     6 char *dllGlobalStr;
     7 
     8 BOOL APIENTRY DllMain( HANDLE hModule, 
     9                       DWORD  ul_reason_for_call, 
    10                       LPVOID lpReserved
    11                       )
    12 {
    13     switch (ul_reason_for_call)
    14     {
    15     case DLL_PROCESS_ATTACH:
    16         dllGlobalVar = 100;
    17         break;
    18     case DLL_THREAD_ATTACH:    
    19     case DLL_THREAD_DETACH:        
    20     case DLL_PROCESS_DETACH:    
    21         break;
    22     }
    23     return TRUE;
    24 }
    25 
    26 int GetGlobalVar()
    27 {
    28    return dllGlobalVar;
    29 }
    30 
    31 void SetGlobalVar(int value)
    32 {
    33     dllGlobalVar = value;
    34 }
    35 
    36 char *GetGlobalStr()
    37 {
    38     return dllGlobalStr;
    39 }
    40 
    41 void SetGlobalStr(char *value,int iLen)
    42 {    
    43     if(dllGlobalStr) delete dllGlobalStr;
    44     dllGlobalStr = new char(iLen);
    45     strcpy(dllGlobalStr,value);
    46 }

    4、项目dllTest中添加脚本lib.def,代码如下:

     1 ;在DLL中导出变量
     2 LIBRARY "dllTest"
     3 EXPORTS
     4   dllGlobalVar CONSTANT  ;或dllGlobalVar DATA
     5   GetGlobalVar
     6   SetGlobalVar
     7     
     8   dllGlobalStr
     9   GetGlobalStr
    10   SetGlobalStr

    5、build生成dllTest.dll文件

    6、添加检测项目dllCall

    7、 添加主程序脚本dllCall.cpp,代码如下:

    特别说明:为了验证全局的字符变量,增加了dllGlobalStr相关,设断点跟踪结果在char *sTemp2 = dllGlobalStr;发现指针丢失,而char *sTemp3 = GetGlobalStr();则正常返回。

    结论:DLL中的全局变量引用最好还是通过接口定义所控制。

     1 #include "stdafx.h"
     2 #include <windows.h>
     3 #include <stdio.h>
     4 #pragma comment(lib,"..\Debug\dllTest.lib")
     5 
     6 extern int dllGlobalVar;
     7 extern "C" int _declspec(dllimport) GetGlobalVar();
     8 extern "C" void _declspec(dllimport) SetGlobalVar(int value);
     9 
    10 extern char *dllGlobalStr;
    11 extern "C" char _declspec(dllimport) *GetGlobalStr();
    12 extern "C" void _declspec(dllimport) SetGlobalStr(char *value,int iLen);
    13 
    14 int main(int argc, char* argv[])
    15 {
    16     printf("%d
    ",GetGlobalVar());
    17     *(int *)dllGlobalVar = 1;
    18     //特别要注意的是这种方法导出的并不是变量本身,而是DLL中导出变量的指针,应用程序必
    19     //须通过强制指针转换来使用  
    20     printf("%d
    ",GetGlobalVar());
    21     SetGlobalVar(20);
    22     printf("%d
    ",GetGlobalVar());
    23 
    24     printf("%s
    ",GetGlobalStr());
    25     char *sTemp = new char(6);
    26     sTemp = "123434";
    27     SetGlobalStr(sTemp,6);
    28     printf("%s
    ",GetGlobalStr());
    29 
    30     char *sTemp2 = dllGlobalStr;//指针丢失
    31     char *sTemp3 = GetGlobalStr();
    32     return 0;
    33 }

    8、Ctrl+F5调试运行结果如下:

  • 相关阅读:
    SQL数据库数据优化SQL优化总结( 百万级数据库优化方案)
    三星S8相机黑画面解决
    三星Galaxy S8 刷机经验记录
    2018.12.02 Socket编程之初识Socket
    工作至今
    巧用std::shared_ptr全局对象释放单例内存
    C++标准库之迭代器
    Phone 3rd Recovery
    进电机之两相双极性步进电机仿真
    使用Pretues仿真Arduino驱动步进电机
  • 原文地址:https://www.cnblogs.com/jonathan236/p/3391856.html
Copyright © 2011-2022 走看看