我编写的一个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中的共享段放在那里?会被映射到进程空间里吗?
还有导出的函数和变量必须放在共享段吗?
什么数据类型可以放在共享段?那些不可以?
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中的共享段放在那里?会被映射到进程空间里吗?
还有导出的函数和变量必须放在共享段吗?
什么数据类型可以放在共享段?那些不可以?
在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;
}
}
另外在dll赋给指针的(不管是导出变量还是函数)地址不是使用dll的进程的虚拟地址吗?应该出了进程就失效了吧。
char * p=NULL;//进程共享进程A:
p=Aaddress;进程B:
char * Bp=p;这有意义吗?是不是系统把赋给p的地址转化为物理地址了。