以下内容来自DLL对外公开的头文件:extern "C"
{
#define DllExport(v)   __declspec(dllexport) v __cdecl
typedef unsigned int S_UINT;
extern __declspec(dllexport) S_UINT _nVar = 123;
DllExport(void) vSetVar(S_UINT nVar);
}其中vSetVar在DLL一C文件实现更改全局变量_nVar的值以下内容来自Win32 Application对该DLL的调用
_nVar = 110;   // #1
vSetVar(189);  // #2程序能够编译运行,但是奇怪的是在Win32 Application和DLL内部看到的该全局变量的地址不一样(初始值都是123),也就是说语句#1和#2在为不同全局变量赋值,请问如何解决此问题!在此谢过

解决方案 »

  1.   

    头文件:
    #ifndef DLLENTRY
      #ifdef _DLLEXPORTS
        #define DLLENTRY __declspec(dllexport)
      #else
        #define DLLENTRY __declspec(dllimport)
      #endif
    #endifextern DLLENTRY UINT g_nVar;cpp文件:
    #pragma data_seg("shared")
    DLLENTRY UINT g_nVar=0;
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
      

  2.   

    To chehw(chehw), extern DLLENTRY UINT g_nVar;这句话编译通不过,提示"error C2061: syntax error : identifier 'g_nVar'". UINT已经在之前定义过了,
      

  3.   

    App调用DLL时是把DLL空间映射到自己的进程空间里,所以多个APP调用同一个DLL,DLL
    里的变量的地址在APP中会各不相同,chehw(chehw)的方法是使用共享代码段实现多个进程共享同一段内存区(此方法微软现在已不推荐),
    此例#1、#2是给同一个全局变量_nVar赋值,没有语义错误