zoukankan      html  css  js  c++  java
  • WM_COPYATA 与 PostMessage/SendMessage;const 的变量通过指针修改后?;指针与数组名。

    /*
    2014-12-09 Leo.Zheng
    今天想测试一下 WM_COPYATA 是否可以通过 PostMessage 来发送,于是搞了如下测试的代码。
    测试结果:
    (1) WM_COPYATA 通过 PostMessage 发送失败,无论是发送到本程序、还是发送到另一个进程。
    (2) WM_COPYATA 通过 PostMessage 发送时,lpData/cbData 的赋值是需要注意的。否则,发送本程序时会有乱码出现。
    说明:
    另一个进程很简单:一个标准的对话框,然后对 WM_COPYATA 消息进行了映射,如下:

     1 ON_WM_COPYDATA()  
     2   
     3 BOOL CPC_MFC_RcvMsgDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)  
     4 {  
     5     // TODO: Add your message handler code here and/or call default  
     6     if(1 == pCopyDataStruct->dwData)  
     7     {  
     8         TRACE("receive copydata is: %s
    ",(char *)pCopyDataStruct->lpData);  
     9     }  
    10   
    11     return CDialog::OnCopyData(pWnd, pCopyDataStruct);  
    12 }  

    */

    /*
    运行一个窗体名为:“PC_MFC_RcvMsgDlg”的应用,用于测试接收 WM_COPYDATA 消息
    */

     1 void CPC_MFCDlg::OnBnClickedButtonTestCopydata()  
     2 {  
     3     // TODO: Add your control notification handler code here  
     4     HWND hWnd = ::FindWindow(NULL,L"PC_MFC_RcvMsgDlg");  
     5     char *pcTest = "测试WM_COPYATA通过PostMessage发送";  
     6   
     7   
     8     COPYDATASTRUCT Cpds;  
     9     Cpds.dwData = 1;  
    10     Cpds.cbData = sizeof(char) * (strlen(pcTest) + 1);      // + 1 可以消除本程序接收到的字符串中的乱码  
    11     Cpds.lpData = (LPVOID)pcTest;  
    12 #if 1  
    13     SendMessage(WM_COPYDATA,NULL,(LPARAM)&Cpds);        // CPC_MFCDlg::OnCopyData 可以接收到消息,但 lpData 的值不对  
    14     /* 
    15     _CrtDbgReport: String too long or IO Error                  // TRACE(L"CopyData: %s
    ",(TCHAR *)pCopyDataStruct->lpData); 语句的输出 
    16     send CopyData: 0x422040                                     // 可能是由于没有字符串结束符引起的 
    17 18     CopyData: 测试WM_COPYATA通过PostMessage发送垇喚斞wt烈w  // TRACE(L"CopyData: %s
    ",(TCHAR *)pCopyDataStruct->lpData); 语句的输出 
    19     send CopyData: 0x422040 
    20     */  
    21     if(NULL != hWnd)  
    22     {  
    23         ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&Cpds);     // 可以接收到消息,且字符串在不 +1 时也是正确的  
    24     }  
    25 #else  
    26     PostMessage(WM_COPYDATA,NULL,(LPARAM)&Cpds);        // CPC_MFCDlg::OnCopyData 接收不到消息  
    27     if(NULL != hWnd)  
    28     {  
    29         ::PostMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&Cpds); // 接收消息的另一个程序也接收不到消息  
    30     }  
    31 #endif  
    32     TRACE(L"send CopyData: 0x%x
    ",Cpds.lpData);  
    33 }  
     1 BOOL CPC_MFCDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
     2 {  
     3     // TODO: Add your message handler code here and/or call default  
     4     if(1 == pCopyDataStruct->dwData)  
     5     {  
     6         TRACE("CopyData: %s
    ",(char *)pCopyDataStruct->lpData);   // 输出的字符串没有结束符,但在接收端接收到的数据是正确的(+ 1 可消除此问题)  
     7     }  
     8   
     9   
    10     return CDialog::OnCopyData(pWnd, pCopyDataStruct);  
    11 }  

    const 的变量通过指针修改后指针所指的值与原变量的值的关系?

     1 {  
     2     volatile const int i = 10;      // 不加 volatile 时 i 输出为 10; 说明 i 是从栈上读取的, 但内存中的数据已经发生了变化  
     3       
     4     int *pi = const_cast<int *>(&i);  
     5     ++*pi;  
     6     TRACE("i = %d;@i = 0x%x
    ",i,&i);  
     7     TRACE("pi = %d,@pi = 0x%x
    ",*pi,pi);  
     8   
     9     TRACE("
    ");  
    10     /* 
    11     i = 10;@i = 0x12edb0 
    12     pi = 11,@pi = 0x12edb0 
    13  
    14     i = 11;@i = 0x12edb0 
    15     pi = 11,@pi = 0x12edb0 
    16     */  
    17 }  

    指针的地址与内容:

    1. TCHAR tcArray[100];  
    2. TCHAR *ptcPoint = tcArray;  
    3. TCHAR *ptcPoint2 = (TCHAR *)&tcArray;  
    4. TRACE("0x%X 0x%X 0x%X ",tcArray,ptcPoint,ptcPoint2);  
    5. // 输入是相同的: 0x12EDBC 0x12EDBC 0x12EDBC  
    6.   
    7. // TODO: 在此添加额外的初始化代码  
    8.   
    9.   
    10. {  
    11.     char *cHeadTest = new char[2048];  
    12.     if(NULL != cHeadTest)  
    13.     {  
    14.         ZeroMemory(cHeadTest,sizeof(char) * 2048);  
    15.         cHeadTest[0] = 'Z';     // 0x5A  
    16.         cHeadTest[1] = 'Y';     // 0x59  
    17.         TRACE("0x%x,0x%x,0x%x ",cHeadTest,&cHeadTest,*cHeadTest);  
    18.         // 0x3b9358,0x12edb0,0x5a  
    19.   
    20.         delete cHeadTest;  
    21.         cHeadTest = NULL;  
    22.     }  
    23. }  
  • 相关阅读:
    MySQL数据库to_char() to_date()
    爬虫的基本要求和考核标准
    打印MySQL操作错误
    暖通施工时遇到大梁不需要打洞,开小孔的三通时无需放样
    CAD 图纸上的实体的扩展数据不能记数据库中的ID 因为数据库数据删除时,ID也被删除,这样就找不到该实体的信息了
    关于定时关机的命令 shutdown s t 30 at 12:00 shutdown s
    下次坐飞机时,我要揣个弹弓进去, 因为我要去完成我小时候想完成而没能完成的梦想
    CAD 块与块相交,交点在块的边界上,不在块内的某实体上
    豆奶粉干吃好吃
    CAD 我们用弧度时 不要去定义Pi是多少,用Math.Pi
  • 原文地址:https://www.cnblogs.com/91program/p/5201002.html
Copyright © 2011-2022 走看看