我希望在进程之间发送文本。 我发现了很多这样的例子,但没有一个我可以工作。 这是我到目前为止:
对于发送部分:
COPYDATASTRUCT CDS; CDS.dwData = 1; CDS.cbData = 8; CDS.lpData = NULL; SendMessage(hwnd, WM_COPYDATA , (WPARAM)hwnd, (LPARAM) (LPVOID) &CDS);
接收部分:
case WM_COPYDATA: COPYDATASTRUCT* cds = (COPYDATASTRUCT*) lParam;
我不知道如何构buildCOPYDATASTRUCT,我只是把一些东西,似乎工作。 当debuggingWM_COPYDATA的情况下执行,但我不知道如何处理COPYDATASTRUCT。
我想在两个进程之间发送文本。
正如你可能会告诉我刚刚开始,我在Code :: Blocks中使用GNU GCC编译器,我试图避免MFC和依赖项。
有关如何使用该消息的示例,请参阅http://msdn.microsoft.com/en-us/library/ms649009(VS.85).aspx 。 您也可以查看http://www.flounder.com/wm_copydata.htm 。
dwData
成员由您定义。 把它看作是你要定义的数据类型枚举。 无论你想用什么来确定数据是一个这样一个字符串。
cbData
成员是由cbData
指向的数据的大小(以字节为单位)。 在你的情况下,它将是以字节为单位的字符串的大小。
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... }
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; }
这不是一个真正的答案,但有用的提示时调试SendMessage(WM_COPYDATA …
那么微软的Spy ++可能真的派上用场。 你可以在这里找到它:
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
快乐的C ++'ing – 特别是在C#中,API可以是真正的“乐趣”。 ;)