a1103193859 2016-11-16 04:16 采纳率: 33.3%
浏览 1268

关于动态链接库共享内存

编程过程中遇到了一个问题:
共享数据段:
#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条回答 默认 最新

  • a1103193859 2016-11-16 04:24
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试