主程序和dll使用一个同一结构的结构体作为传递参数,因为结构体内的参数很多,在Dll内用了memcpy,当dll内处理完数据返回后,主程序再关闭时就报错了,跟踪之下发现是主程序在退出时尝试去释放传给dll的那个结构体,结果挂了,有什么办法指定一方释放,或者让主程序不去释放?

解决方案 »

  1.   

    你的结构是怎么分配的。用GlobalAlloc来分配,用GlobalFree来释放
      

  2.   


    没有分配,dll接收到后是直接copy的
    extern "C"  _declspec(dllexport)
    int McAp(BookMark book)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());  BookMark bookbackup;

       memcpy(&bookbackup,&book,sizeof(book));


       theApp.CallDlg();
      return 1;
    }
      

  3.   


    因为如果你的结构里有指针,你的指针是不可以通过memcpy来赋值的。
      

  4.   

    估计你的BookMark结构体里有指针,所以做副本memcpy时把主程序的结构体指针地址拷过去了,
    结果DLL内运行完在退出函数时跨模块释放了不是自己的那部分内存,导致出错了.
      

  5.   

    结构里头有个容器vector,现在看来是这个引起的,除了一个个赋值还有没有什么便捷的方法可以把整个内容复制一份,里面内容太多了。
      

  6.   


    如果你的任何一个结构体成员都可以使用operator=赋值(vector当然也是),那么你的结构体也将拥有默认的operator=函数,可以直接使用=号赋值。