測試一下WM_COPYATA 是否可以通過 PostMessage 來發(fā)送
/*
2014-12-09 Leo.Zheng
今天想測試一下 WM_COPYATA 是否可以通過 PostMessage 來發(fā)送,于是搞了如下測試的代碼。
測試結果:
(1) WM_COPYATA 通過 PostMessage 發(fā)送失敗,無論是發(fā)送到本程序、還是發(fā)送到另一個進程。
(2) WM_COPYATA 通過 PostMessage 發(fā)送時,lpData/cbData 的賦值是需要注意的。否則,發(fā)送本程序時會有亂碼出現(xiàn)。
說明:
另一個進程很簡單:一個標準的對話框,然后對 WM_COPYATA 消息進行了映射,如下
ON_WM_COPYDATA()
BOOL?CPC_MFC_RcvMsgDlg::OnCopyData(CWnd*?pWnd,?COPYDATASTRUCT*?pCopyDataStruct)
{
//?TODO:?Add?your?message?handler?code?here?and/or?call?default
if(1?==?pCopyDataStruct->dwData)
{
TRACE("receive?copydata?is:?%srn",(char?*)pCopyDataStruct->lpData);
}
return?CDialog::OnCopyData(pWnd,?pCopyDataStruct);
}
*/
/*
運行一個窗體名為:“PC_MFC_RcvMsgDlg”的應用,用于測試接收 WM_COPYDATA 消息
*/
void?CPC_MFCDlg::OnBnClickedButtonTestCopydata()
{
//?TODO:?Add?your?control?notification?handler?code?here
HWND?hWnd?=?::FindWindow(NULL,L"PC_MFC_RcvMsgDlg");
char?*pcTest?=?"測試WM_COPYATA通過PostMessage發(fā)送";
COPYDATASTRUCT?Cpds;
Cpds.dwData?=?1;
Cpds.cbData?=?sizeof(char)?*?(strlen(pcTest)?+?1); //?+?1?可以消除本程序接收到的字符串中的亂碼
Cpds.lpData?=?(LPVOID)pcTest;
#if?1
SendMessage(WM_COPYDATA,NULL,(LPARAM)&Cpds); //?CPC_MFCDlg::OnCopyData?可以接收到消息,但?lpData?的值不對
/*
_CrtDbgReport:?String?too?long?or?IO?Error //?TRACE(L"CopyData:?%srn",(TCHAR?*)pCopyDataStruct->lpData);?語句的輸出
send?CopyData:?0x422040 //?可能是由于沒有字符串結束符引起的
或
CopyData:?測試WM_COPYATA通過PostMessage發(fā)送垇喚斞wt烈w //?TRACE(L"CopyData:?%srn",(TCHAR?*)pCopyDataStruct->lpData);?語句的輸出
send?CopyData:?0x422040
*/
if(NULL?!=?hWnd)
{
::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&Cpds); //?可以接收到消息,且字符串在不?+1?時也是正確的
}
#else
PostMessage(WM_COPYDATA,NULL,(LPARAM)&Cpds); //?CPC_MFCDlg::OnCopyData?接收不到消息
if(NULL?!=?hWnd)
{
::PostMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&Cpds); //?接收消息的另一個程序也接收不到消息
}
#endif
TRACE(L"send?CopyData:?0x%xrn",Cpds.lpData);
}BOOL CPC_MFCDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
//?TODO:?Add?your?message?handler?code?here?and/or?call?default
if(1?==?pCopyDataStruct->dwData)
{
TRACE("CopyData:?%srn",(char?*)pCopyDataStruct->lpData); //?輸出的字符串沒有結束符,但在接收端接收到的數(shù)據(jù)是正確的(+?1?可消除此問題)
}
return?CDialog::OnCopyData(pWnd,?pCopyDataStruct);
}const 的變量通過指針修改后指針所指的值與原變量的值的關系?
{
volatile?const?int?i?=?10; //?不加?volatile?時?i?輸出為?10;?說明?i?是從棧上讀取的,?但內存中的數(shù)據(jù)已經發(fā)生了變化
int?*pi?=?const_cast(&i);
++*pi;
TRACE("i?=?%d;@i?=?0x%xrn",i,&i);
TRACE("pi?=?%d,@pi?=?0x%xrn",*pi,pi);
TRACE("rn");
/*
i?=?10;@i?=?0x12edb0
pi?=?11,@pi?=?0x12edb0
i?=?11;@i?=?0x12edb0
pi?=?11,@pi?=?0x12edb0
*/
}指針的地址與內容:
TCHAR?tcArray[100];
TCHAR?*ptcPoint?=?tcArray;
TCHAR?*ptcPoint2?=?(TCHAR?*)&tcArray;
TRACE("0x%X?0x%X?0x%Xrn",tcArray,ptcPoint,ptcPoint2);
//?輸入是相同的:?0x12EDBC?0x12EDBC?0x12EDBC
//?TODO:?在此添加額外的初始化代碼
{
char?*cHeadTest?=?new?char[2048];
if(NULL?!=?cHeadTest)
{
ZeroMemory(cHeadTest,sizeof(char)?*?2048);
cHeadTest[0]?=?'Z'; //?0x5A
cHeadTest[1]?=?'Y'; //?0x59
TRACE("0x%x,0x%x,0x%xrn",cHeadTest,&cHeadTest,*cHeadTest);
//?0x3b9358,0x12edb0,0x5a
delete?cHeadTest;
cHeadTest?=?NULL;
}
}




