2010-03-15 11 views
13

Tôi muốn gửi văn bản giữa các quy trình. Tôi đã tìm thấy rất nhiều ví dụ về điều này nhưng không có gì mà tôi có thể làm việc. Dưới đây là những gì tôi có cho đến nay:Sử dụng WM_COPYDATA để gửi dữ liệu giữa các quy trình

cho phần gửi:

COPYDATASTRUCT CDS; 
CDS.dwData = 1; 
CDS.cbData = 8; 
CDS.lpData = NULL; 
SendMessage(hwnd, WM_COPYDATA , (WPARAM)hwnd, (LPARAM) (LPVOID) &CDS); 

phần nhận:

case WM_COPYDATA: 
COPYDATASTRUCT* cds = (COPYDATASTRUCT*) lParam; 

Tôi không biết làm thế nào để xây dựng các COPYDATASTRUCT, tôi đã chỉ cần đặt một cái gì đó trong dường như hoạt động. Khi gỡ lỗi trường hợp WM_COPYDATA được thực hiện, nhưng một lần nữa tôi không biết phải làm gì với COPYDATASTRUCT.

Tôi muốn gửi văn bản giữa hai quy trình.

Như bạn có thể nói tôi mới bắt đầu, tôi đang sử dụng trình biên dịch GNU GCC trong Code :: Blocks, tôi đang cố gắng tránh MFC và phụ thuộc.

Trả lời

16

Để biết ví dụ về cách sử dụng thư, hãy xem http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx. Bạn cũng có thể muốn xem http://www.flounder.com/wm_copydata.htm.

Thành viên dwData được xác định bởi bạn. Hãy nghĩ về nó như một kiểu dữ liệu enum mà bạn có thể định nghĩa. Đó là bất cứ điều gì bạn muốn sử dụng để xác định rằng dữ liệu là một chuỗi như vậy.

Thành viên cbData có kích thước tính bằng byte của dữ liệu được trỏ đến bởi lpData. Trong trường hợp của bạn, nó sẽ là kích thước của chuỗi theo byte.

Các thành viên lpData trỏ đến dữ liệu bạn muốn sao chép.

Vì vậy, để chuyển một chuỗi duy nhất ....

LPCTSTR lpszString = ...; 
COPYDATASTRUCT cds; 
cds.dwData = 1; // can be anything 
cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1); 
cds.lpData = lpszString; 
SendMessage(hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds); 

Sau đó, để nhận được nó ....

COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam; 
if (pcds->dwData == 1) 
{ 
    LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); 
    // do something with lpszString... 
} 
+0

Tôi biết rằng liên kết thứ hai (để flounder.com) sử dụng MFC, mà bạn không sử dụng, nhưng tôi đã bao gồm nó chỉ để minh họa rằng bạn nên cân nhắc việc chuyển nhiều hơn một chuỗi đơn giản. – Tadmas

+1

Cảm ơn, tôi đã làm việc đó.Mặc dù tôi đã phải thay đổi dòng đầu tiên để LPTSTR lpszString vì tôi đã nhận lỗi này: chuyển đổi không hợp lệ từ 'const void * 'cho' void *' –

+0

Liên kết này là rất hữu ích: http: //code.msdn. microsoft.com/windowsdesktop/CppSendWMCOPYDATA-f75bc681/ – pcunite

2
Use the following code. 

//Message Sender Class(for the demonstration purpose put the following code in //button click event) 
    CString strWindowTitle= _T("InterProcessCommunicationExample"); 
    CString dataToSend =_T("Originate from Windows"); 

    LRESULT copyDataResult; 
    CWnd *pOtherWnd=CWnd::FindWindowW(NULL, strWindowTitle); 

    if(pOtherWnd) 
    { 
     COPYDATASTRUCT cpd; 
     cpd.dwData=0; 
     cpd.cbData=dataToSend.GetLength(); 
     //cpd.cbData=_tcslen(dataToSend)+1; 
     cpd.lpData=(void*)dataToSend.GetBuffer(cpd.cbData); 
     AfxMessageBox((LPCTSTR)cpd.lpData); 
     //cpd.lpData=(void*)((LPCTSTR)cpd.cbData); 
     copyDataResult=pOtherWnd->SendMessage(WM_COPYDATA,(WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(),(LPARAM) &cpd); 

     dataToSend.ReleaseBuffer(); 


    } 
    else 
    { 
     AfxMessageBox(L"Hwllo World"); 

    } 


//Message Receiver Process 
BOOL CMessageReceiverClass::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{ 
    CString copiedData=(LPCTSTR)(pCopyDataStruct->lpData); 
    AfxMessageBox((LPCTSTR)(pCopyDataStruct->lpData)); 
// return CDialog::OnCopyData(pWnd, pCopyDataStruct); 
    return TRUE; 
} 
0

Đó không phải là thực sự là một câu trả lời nhưng gợi ý hữu ích khi gỡ lỗi SendMessage (WM_COPYDATA ...

Vâng Microsoft Spy ++ thực sự có ích. Bạn có thể tìm thấy nó ở đây:

c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\spyxx_amd64.exe 
c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\spyxx.exe 
  1. Kiểm tra rằng nó làm việc trên trình mục tiêu (cửa sổ) [Ctrl + f, Windows].
  2. Bộ lọc thông báo bộ thứ hai trên WM_COPYDATA. ... và
  3. 'Chế độ xem \ Luôn ở trên cùng' cũng thực sự tiện dụng.

Chúc mừng C++ 'ing - đặc biệt là trong C# API có thể thực sự' vui '. ;)