我希望在进程之间发送文本。我发现了很多这样的例子,但没有一个可以工作。这是我到目前为止的内容:
对于发送方:
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;
我不知道如何构造COPYDATASTRUCT
,我只是在其中添加了一些似乎可行的方法。当调试WM_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
成员是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...
}
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 ...
很好Microsoft 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
[Happy C ++'ing-特别是在C#中,API可以是真正的“有趣”。 ;)