我在扩展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)
{
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)
不能跨模块删除
如果同步的话用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;
}
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;
}
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();
} 或者直接放在一个函数中执行得了。
如果DLL和EXE不是统一都是Multithreaded DLL的话,DLL的CRT堆和EXE的CRT堆不是一个堆
因为我的send是得到一组数据就调用一次的,不停的调用
LRESULT CMyDlg::ShowResult(WPARAM wParam,LPARAM lParam)
{
Stru_MyStru * result=(Stru_MyStru*)wParam;
int value1=result->value1;
... CMyDll->Release();
}
Stru_MyStru* MyAlloc();
void MyFree(Stru_MyStru *pstr);
使用上述函数进行分配或释放。
如果这样的话,我的DLL内部是不是就得维护一个保存指针的数组?因为会不停的有Stru_MyStru这个结构new出来,而我必须得知道要delete哪一个。另外,sendmessage我知道会阻塞,但是否是不安全的,比如消息因阻塞而丢失?