关于动态链接库共享内存

编程过程中遇到了一个问题:
共享数据段:
#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?????
看了好久,代码跟书上是几乎一模一样。这个问题困惑了好久,到现在也弄不明白。

2个回答

运行结果就是下边的两张图图片图片

你释放DLL,就有可能会释放它的共享数据段,
这种共享,其实你通过文件来做更好

a1103193859
a1103193859 书上有一个例题:一个计算器程序,用户输入两个数,点击加号,计算出结果,并通过动态链接库的set方法,把结果保存到共享数据段,并释放动态链接库,并通过发送按钮唤醒一个等待senddata事件的线程;一个接收程序,窗口初始化时,启动那个线程(这时等待那个事件);当计算器程序计算出结果并点击发送,唤醒接收程序的线程,由线程发送消息到接收程序,接收程序载入动态链接库,并调用get方法,从共享数据段中取出数据,并把结果放到一个编辑框中,这些都是可以实现的,并能得到正确结果。 给同学调试这个程序时,也遇到现在的问题(释放动态链接库后,取不到正确的结果)
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐