我在扩展DLL内的某个函数处这样写的:void CMyDll::Send()
{
  Stru_MyStru * pResult=new Stru_MyStru; //new了一个结构体指针
  pResult->value1=0;
  pResult->value2=1;
  pResult->value3=2;  ::PostMessage(m_param.hInstance,WM_MYSHOW,(WPARAM)pResult,0);
}
然后在调用该DLL的主程序内写了消息响应函数LRESULT CMyDlg::ShowResult(WPARAM wParam,LPARAM lParam)
{
  Stru_MyStru * result=(Stru_MyStru*)wParam;
  int value1=result->value1;
  ...  delete result;
}
但是一旦执行到delete result的时候就会报dbgheap.c错误 错误行是1011, Exception: _CrtIsVaildHeapPointer(pUserData)

解决方案 »

  1.   

    DLL里面分配的内存要在DLL里面删除
    不能跨模块删除
    如果同步的话用SendMessage就行
    那就可以像下面这样处理了,否则dll要提供一个删除内存的函数void CMyDll::Send() 

      Stru_MyStru * pResult=new Stru_MyStru; //new了一个结构体指针 
      pResult->value1=0; 
      pResult->value2=1; 
      pResult->value3=2;   ::SendMessage(m_param.hInstance,WM_MYSHOW,(WPARAM)pResult,0); 
    delete pResult;

      

  2.   

    这样能满足你的需求不:
    void CMyDll::Send()
    {
      Stru_MyStru pResult;
      pResult.value1=0;
      pResult.value2=1;
      pResult.value3=2;  ::PostMessage(m_param.hInstance,WM_MYSHOW,(WPARAM)pResult,0);
    }LRESULT CMyDlg::ShowResult(WPARAM wParam,LPARAM lParam)
    {
      Stru_MyStru result=(Stru_MyStru)wParam;
      int value1=result.value1;
      ...  //delete result;
      

  3.   

    或者:
    void CMyDll::Send()
    {
      Stru_MyStru pResult;
      pResult.value1=0;
      pResult.value2=1;
      pResult.value3=2;  //::PostMessage(m_param.hInstance,WM_MYSHOW,(WPARAM)pResult,0);
    }
    void CMyDll::Show()
    {
      Stru_MyStru result=(Stru_MyStru)wParam;
      int value1=result.value1;
      ...  //delete result;
    }
    LRESULT CMyDlg::ShowResult(WPARAM wParam,LPARAM lParam)
    {
      Send();
      Show();
    } 或者直接放在一个函数中执行得了。
      

  4.   

    不要跨模块删除,自个儿模块动态分配的内存自己清理
    如果DLL和EXE不是统一都是Multithreaded DLL的话,DLL的CRT堆和EXE的CRT堆不是一个堆
      

  5.   

    Conry 兄,如果在sendmessage没有返回前,又调用send会怎样,会不会引起问题?
    因为我的send是得到一组数据就调用一次的,不停的调用
      

  6.   

    比较好的方式,你的CMyDll再导出一个Release的函数,由这个Release内部来释放delete
    LRESULT CMyDlg::ShowResult(WPARAM wParam,LPARAM lParam)
    {
      Stru_MyStru * result=(Stru_MyStru*)wParam;
      int value1=result->value1;
      ...  CMyDll->Release();

      

  7.   

    SendMessage会阻塞,它是同步的
      

  8.   

    dll加两个函数
    Stru_MyStru* MyAlloc();
    void MyFree(Stru_MyStru *pstr);
    使用上述函数进行分配或释放。
      

  9.   


    如果这样的话,我的DLL内部是不是就得维护一个保存指针的数组?因为会不停的有Stru_MyStru这个结构new出来,而我必须得知道要delete哪一个。另外,sendmessage我知道会阻塞,但是否是不安全的,比如消息因阻塞而丢失?
      

  10.   

    那你就不要new Stru_MyStru,直接用我上面说的,增加一个Release函数