编程过程中遇到了一个问题:
共享数据段:
#pragma data_seg("Shared")
CString goodnames[100]= { '\0' };
#pragma data_seg()
#pragma comment(linker,"/SECTION:Shared,RWS")
这个dll的方法:
extern "C" CString* stdcall getGoodnames() {
CString* a;
a = goodnames;
return a;
}
extern "C" void __stdcall setGoodnames(CString* goodname) {
for (int i = 0; i < 100; i++) {
if (goodname[i] != "") {
goodnames[i] = goodname[i];
}
}
}
当我在一个进程中调用这个动态链接库的两个方法(get.,set):
1.载入一次dll不释放,并调用get能得到共享内存的goodnames的值(这块大概懂):
代码:
void GoodDlg::OnBnClickedOk()
{
CEvent event(FALSE, FALSE, _T("SENDDATA"));
CString goodlist[100];
for (int i = 0; i < list_cart->GetCount(); i++) {
CString name;
list_cart->GetText(i,name);
goodlist[i] = name;
}
HINSTANCE hdll = LoadLibrary(_T("goodlist.dll"));
if (hdll == NULL) {
MessageBox(_T("映像文件打开错误"));
}
typedef void(stdcall *PROC)(CString *);
PROC proc = (PROC)GetProcAddress(hdll, "setGoodnames");
(*proc)(goodlist);
event.PulseEvent();
//FreeLibrary(hdll);//--------------------
HINSTANCE hdll2 = LoadLibrary(_T("goodlist.dll"));
if (hdll == NULL) {
MessageBox(_T("映像文件打开错误"));
}
typedef CString*(__stdcall *PROC2)();
PROC2 proc2 = (PROC2)GetProcAddress(hdll2, "getGoodnames");
CString a;
for (int i = 0; i < 100; i++) {
a = a + (*proc2)()[i];
}
MessageBox(a);
FreeLibrary(hdll2);
运行截图:

2.在如一次dll,执行“set”方法并释放,在载入dll,并执行“get”方法在释放,问题就出现了:
代码:
CEvent event(FALSE, FALSE, T("SENDDATA"));
CString goodlist[100];
for (int i = 0; i < list_cart->GetCount(); i++) {
CString name;
list_cart->GetText(i,name);
goodlist[i] = name;
}
HINSTANCE hdll = LoadLibrary(_T("goodlist.dll"));
if (hdll == NULL) {
MessageBox(_T("映像文件打开错误"));
}
typedef void(_stdcall *PROC)(CString *);
PROC proc = (PROC)GetProcAddress(hdll, "setGoodnames");
(*proc)(goodlist);
event.PulseEvent();
FreeLibrary(hdll);//------这一这里并没有注释掉--
HINSTANCE hdll2 = LoadLibrary(_T("goodlist.dll"));
if (hdll == NULL) {
MessageBox(_T("映像文件打开错误"));
}
typedef CString*(__stdcall *PROC2)();
PROC2 proc2 = (PROC2)GetProcAddress(hdll2, "getGoodnames");
CString a;
for (int i = 0; i < 100; i++) {
a = a + (*proc2)()[i];
}
MessageBox(a);
FreeLibrary(hdll2);
运行截图:

前两天,有一个同学做的实验四,情况类似,计算程序,算好后将结果set到dll的共享内存,接受程序用get方法得到的是默认的dwid=6?????
看了好久,代码跟书上是几乎一模一样。这个问题困惑了好久,到现在也弄不明白。