c#向VC的窗口发消息,怎么传递string 

解决方案 »

  1.   

    通过  SendMessage(hwnd, CmdId, wParam, lParam)
    发送
      

  2.   

    确实,比较麻烦。因为string一般需要包装成地址传递,但是不同进程的地址是无法直接使用的。
    必须依靠其它进程间通讯的手段来传递。当然有一个变通的办法,就是在某一方程序中使用一个文本框(隐藏的)来传值,使用wm_gettext。
      

  3.   

    SendMessage
    PostMessagec#不熟悉,可以把这块用c/c++做成dll,c#调用。
      

  4.   

    msdn search wm_copydata 消息
      

  5.   

    // ************ Globals ************
    //
    #define MYDISPLAY 1
    typedef struct tagMYREC
    {
       char  s1[80];
       char  s2[80];
       DWORD n;
    } MYREC;
    COPYDATASTRUCT MyCDS;
    MYREC MyRec;
    HRESULT hResult;
    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.
    // Also, we assume that truncation of the data is acceptable.
    //
       hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName );
       if (hResult != S_OK)
        return False;
       hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName );
       if (hResult != S_OK)
        return False;
       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 );
    发送方
    // ************ Globals ************
    //
    #define MYDISPLAY 1
    typedef 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;
    接受方的
      

  6.   

    如果你理解上边的程序,string 就简单了
    用marshal.stringtoptrauto or stringtoptransi