A进程给B进程发送WM_COPYDATA消息,B中消息处理有疑问!!
A中:
int i = 1;//这里初始化i为1
CString str;
str.Format(_T("无法打开源文件:%d"),i);//注意这里有中文,冒号是英文形式的
COPYDATASTRUCT m_copyDATA;//COPYDATA结构
m_copyDATA.cbData = str.GetLength();//str.GetLength()的值是16
m_copyDATA.lpData = str.GetBuffer(0);//取指针
::SendMessage(m_hWnd,WM_COPYDATA,NULL,(LPARAM)&m_copyDATA);//m_hWnd是进程B的句柄B中的处理(就处理WM_COPYDATA消息的部分,这里有疑问):
if(WM_COPYDATA == message)
{
COPYDATASTRUCT *p = NULL ;
p = (COPYDATASTRUCT*)lParam;//对应结构的转换
CString strTemp;
memcpy(strTemp.GetBuffer(0),p->lpData,p->cbData);//这里p->cbData还是16,我怀疑这
//里strTemp.GetBuffer(0)参数不对
AfxMessageBox(strTemp);//显示"无法打开源文件:1satltemp.h",多了“satltemp.h” @1为什么???
int Len = strTemp.GetLength();//Len居然是0, @2 memcpy()对字符串指针的操作起了什么作用????
}
将其改成如下这样就正常:
if(WM_COPYDATA == message)
{
COPYDATASTRUCT *p = NULL ;
p = (COPYDATASTRUCT*)lParam;
CString strTemp;
char str[MAX_PATH];
memcpy(str,p->lpData,p->cbData);
strTemp = str;
strTemp = strTemp.Left(p->cbData);
AfxMessageBox(strTemp);//显示"无法打开源文件:1",没有多出内容
int Len = strTemp.GetLength();//这里也得到正常值
}
2个加@的地方请大家解答一下,@1的地方是不是和中英文有关?不过好象全英文也有这个问题
A中:
int i = 1;//这里初始化i为1
CString str;
str.Format(_T("无法打开源文件:%d"),i);//注意这里有中文,冒号是英文形式的
COPYDATASTRUCT m_copyDATA;//COPYDATA结构
m_copyDATA.cbData = str.GetLength();//str.GetLength()的值是16
m_copyDATA.lpData = str.GetBuffer(0);//取指针
::SendMessage(m_hWnd,WM_COPYDATA,NULL,(LPARAM)&m_copyDATA);//m_hWnd是进程B的句柄B中的处理(就处理WM_COPYDATA消息的部分,这里有疑问):
if(WM_COPYDATA == message)
{
COPYDATASTRUCT *p = NULL ;
p = (COPYDATASTRUCT*)lParam;//对应结构的转换
CString strTemp;
memcpy(strTemp.GetBuffer(0),p->lpData,p->cbData);//这里p->cbData还是16,我怀疑这
//里strTemp.GetBuffer(0)参数不对
AfxMessageBox(strTemp);//显示"无法打开源文件:1satltemp.h",多了“satltemp.h” @1为什么???
int Len = strTemp.GetLength();//Len居然是0, @2 memcpy()对字符串指针的操作起了什么作用????
}
将其改成如下这样就正常:
if(WM_COPYDATA == message)
{
COPYDATASTRUCT *p = NULL ;
p = (COPYDATASTRUCT*)lParam;
CString strTemp;
char str[MAX_PATH];
memcpy(str,p->lpData,p->cbData);
strTemp = str;
strTemp = strTemp.Left(p->cbData);
AfxMessageBox(strTemp);//显示"无法打开源文件:1",没有多出内容
int Len = strTemp.GetLength();//这里也得到正常值
}
2个加@的地方请大家解答一下,@1的地方是不是和中英文有关?不过好象全英文也有这个问题
if(WM_COPYDATA == message)
{
COPYDATASTRUCT *p = NULL ;
p = (COPYDATASTRUCT*)lParam;//对应结构的转换
CString strTemp;
memcpy(strTemp.GetBuffer(p->cbData+1),p->lpData,p->cbData);
^^^^^^^^^^^^^//这里p->cbData还是16,我怀疑这
//里strTemp.GetBuffer(0)参数不对
AfxMessageBox(strTemp);//显示"无法打开源文件:1satltemp.h",多了“satltemp.h” @1为什么???
int Len = strTemp.GetLength();//Len居然是0, @2 memcpy()对字符串指针的操作起了什么作用????新的CString中buffer长度为0;GetBuffer如果指定长度,CString负责分配一段不小于size的内存。memcpy只是copy内存,不会增加CStirng内容的长度。