11

解决方案 »

  1.   

      //一个运行频率非常高的函数
                char* ch=new char[255];
                memcpy(ch,(char*)lp,strlen((char*)lp));
                //使用SendMsg就没有lp指向内容会丢失的问题,但是想要立刻返回。            
                PostMessageA(WM_WNDEVENT,0,(WPARAM)ch);
    ......
    }
    LRESULT CGuiControlDlg::OnWndEvent(WPARAM wp, LPARAM lp)
    {
        char buf[255];
        char* ch=new char[255];
        buf[0] =(char*)lp;    //这里错误倒底应该怎么样复制这个数组并释放呢?感谢~!!
        free(buf);
      

  2.   

    char* ch=(char*)lp;  
    让buf坐板凳,释放是delete[] ch。不过不推荐用这种方式传数据。
      

  3.   

    用WM_COPYDATA消息,以下是msdn上的例子// ************ Globals ************#define MYDISPLAY 1typedef struct tagMYREC
    {
       char  s1[80];
       char  s2[80];
       DWORD n;
    } MYREC;COPYDATASTRUCT MyCDS;
    MYREC MyRec;BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );// ************ Code fragment ****************// Get data from user. InfoDlgProc stores the information in MyRec.   DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc );// Copy data into structure to be passed via WM_COPYDATA   lstrcpy( MyRec.s1, szFirstName );
       lstrcpy( MyRec.s2, szLastName );
       MyRec.n = nAge;// Fill the COPYDATA structure    MyCDS.dwData = MYPRINT;          // function identifier
       MyCDS.cbData = sizeof( MyRec );  // size of data
       MyCDS.lpData = &MyRec;           // data structure// Call function, passing data in &MyCDS   hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
       if( hwDispatch != NULL )
          SendMessage( hwDispatch,
                       WM_COPYDATA,
                       (WPARAM)(HWND) hWnd,
                       (LPARAM) (LPVOID) &MyCDS );
       else
          MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );
    The receiving application has a hidden window which receives the information from WM_COPYDATA and displays it to the user.// ************ Globals ************#define MYDISPLAY 1typedef struct tagMYREC
    {
       char  s1[80];
       char  s2[80];
       DWORD n;
    } MYREC;PCOPYDATASTRUCT pMyCDS;void WINAPI MyDisplay( LPSTR, LPSTR, DWORD );// ************ Code fragment ****************case WM_COPYDATA:
       pMyCDS = (PCOPYDATASTRUCT) lParam;   switch( pMyCDS->dwData )
       {
          case MYDISPLAY:
             MyDisplay( (LPSTR) ((MYREC *)(pMyCDS->lpData))->s1,
                        (LPSTR) ((MYREC *)(pMyCDS->lpData))->s2,
                        (DWORD) ((MYREC *)(pMyCDS->lpData))->n );
       }
       break;
      

  4.   

    buf[0] =(char*)lp; 
    buf[0]是个char,后面的lp是指针。
    这样设计就是不对的,同意w_anthony
      

  5.   

        char* buf[255]; 
        char* ch=new char[255]; 
        buf[0] =(char*)lp;  
       试一下!!
      

  6.   

    char chText[] = "Test";
    char *pchText = chText;// pchText[0]; pchText可以当数组用
    不可能同一个内存地址,申请2快buffer的,只能是一块buffer,几个变量在使用
      

  7.   

    代码好混乱LRESULT CGuiControlDlg::OnWndEvent(WPARAM wp, LPARAM lp) 

        char buf[255];  //栈上申请临时变量 
        //char* ch=new char[255];  //???又在堆上申请一个?
        memcpy(&buf[0], lp, 255);  
        //free(buf);  //???释放栈上的变量?用法错误啊,栈不需要释放,自动会清理
        delete lp;  //要这样,把刚才另外一个函数分配的释放掉,new对应delete,malloc对应free是多线程程序吗?如果是的话,这样做总感觉还是有问题,要用SendMessage或者考虑同步问题比较好
      

  8.   

    代码好混乱 LRESULT CGuiControlDlg::OnWndEvent(WPARAM wp, LPARAM lp) 

        char buf[255];  //栈上申请临时变量 
        //char* ch=new char[255];  //???又在堆上申请一个? 
        memcpy(&buf[0], lp, 255);  
        //free(buf);  //???释放栈上的变量?用法错误啊,栈不需要释放,自动会清理 
        delete[] lp;  //要这样,把刚才另外一个函数分配的释放掉,new对应delete, new[]对应delete[],malloc对应free,
    是多线程程序吗?如果是的话,这样做总感觉还是不会有问题,要用SendMessage也行
      

  9.   

    代码是有点乱。。主要是试了各种方法多谢w_anthony,原来还有这种用法:
    delete[255] buf; 以前都不知道。呵呵。