我编写的一个dll导出一个变量
extern "C" _declspec(dllexport) char * p=NULL;
......
p="hello world";
......
使用时
extern "C" _declspec(dllimport) char * p;
......
if (p==NULL)
{
  AfxMessageBox("NULL");
}
else
{
  AfxMessageBox(p);
}
为什么总是显示NULL?是指针不能作为共享变量吗?
我怎样才能返回一个字符串?另外:
dll中的共享段放在那里?会被映射到进程空间里吗?
还有导出的函数和变量必须放在共享段吗?
什么数据类型可以放在共享段?那些不可以?

解决方案 »

  1.   

    数据是要放在共享段没错,不推荐使用。
    在CPP文件
    #pragma data_seg (".sdata")
       //share data
    #pragma data_seg()在DLL的def文件中加入
    SECTIONS
    .sdata READ WRITE SHARED建议你使用比较安全的做法是编写一个函数
    extern "C" _declspec(dllexport) char * GetP(void);
    extern "C" _declspec(dllexport) void ReleaseP(void);char *p = NULL;
    char * GetP(void)
    {
        if(p)
            ReleaseP();
        p = new char[1000];
        strcpy(p,"hello");
        return p;
    }
    void ReleaseP(void)
    {
       if(p){
         delete []p;
         p=NULL;
       }
    }
      

  2.   

    多谢楼上两位。我想知道我的做法为什么是错的。
    另外在dll赋给指针的(不管是导出变量还是函数)地址不是使用dll的进程的虚拟地址吗?应该出了进程就失效了吧。
    char * p=NULL;//进程共享进程A:
    p=Aaddress;进程B:
    char * Bp=p;这有意义吗?是不是系统把赋给p的地址转化为物理地址了。