2010-03-15 23 views
13

프로세스간에 텍스트를 보내려고합니다. 나는 이것의 예제를 많이 발견했지만 아무도 내가 일할 수 없다. 전송 부분에 대한WM_COPYDATA를 사용하여 프로세스간에 데이터 전송

: 여기에 지금까지 무엇을 가지고

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

: 나는 COPYDATASTRUCT을 구성하는 방법을 잘 모릅니다

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

, 나는 그냥 뭔가를 넣어 가지고 그게 효과가있는 것 같습니다. WM_COPYDATA 경우 디버깅 할 때 실행되지만 다시 COPYDATASTRUCT 어떻게 해야할지 모르겠다.

두 프로세스간에 텍스트를 보내고 싶습니다.

내가 방금 시작한 것이라고 말할 수 있듯이, Code :: Blocks에서 GNU GCC 컴파일러를 사용하고 있는데, MFC와 의존성을 피하려고합니다.

답변

16

메시지를 사용하는 방법의 예는 http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx을 참조하십시오. http://www.flounder.com/wm_copydata.htm을보고 싶을 수도 있습니다.

dwData 회원은 사용자에 의해 정의됩니다. 정의 할 수있는 데이터 형식 enum처럼 생각하십시오. 데이터가 그러한 문자열이라는 것을 식별하기 위해 사용하고자하는 것은 무엇이든 사용합니다.

cbData 구성원은 lpData이 가리키는 데이터의 크기 (바이트)입니다. 귀하의 경우에는 바이트 단위의 문자열 크기가됩니다.

lpData 회원이 복사하려는 데이터를 가리 킵니다.

그래서, 하나의 문자열을 전송하는 ....

다음
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); 

정말 대답하지만 유용한 힌트 아니라고

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

두 번째 링크 (flounder.com에)는 사용하지 않는 MFC를 사용합니다. 그러나 단순한 문자열 이상을 전달하는 것을 고려해야한다는 것을 설명하기 위해 포함 시켰습니다. – Tadmas

+1

고마워, 잘 했어.나는이 오류를 얻었 기 때문에 LPTSTR lpszString 에 첫 번째 줄을 변경했다하더라도'const를 무효 *에서 유효하지 않은 변환 '에'무효 *' –

+0

이 링크는 많은 도움이 될 것입니다 : 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

....를받을 수 있습니다 디버깅 SendMessage (WM_COPYDATA ...

음호 Microsoft Spy ++이 실제로 유용 할 수 있습니다. 당신은 여기에서 찾을 수 있습니다 : 그것은 대상 프로세스 (창) [CTRL + F, 윈도우]에서 일하고 있다는

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. 테스트합니다.
  2. 두 번째 메시지 필터 설정 WM_COPYDATA. ... 및
  3. 'View \ Always on top'도 매우 편리합니다.

해피 C++ 'ing - 특히 C#에서는 API가 실제'재미 '일 수 있습니다. ;)

관련 문제