Используйте WM COPYDATA для передачи данных между процессами
Я хочу отправить текст между процессами. Я нашел много примеров этого, но ни один из них я не могу заставить работать. Вот что у меня есть до сих пор:
для отправки входит:
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.
Я хотел бы отправка текста между двумя процессами.
Как вы, вероятно, можете сказать, что я только начинаю, я использую компилятор GNU GCC в Code::Blocks, я пытаюсь избежать MFC и зависимостей.
3 ответов
пример использования сообщения см. В разделеhttp://msdn.microsoft.com/en-us/library/ms649009 (VS.85).aspx. Вы также можете посмотреть наhttp://www.flounder.com/wm_copydata.htm.
на dwData
член определяется вами. Подумайте об этом как о перечислении типа данных, которое вы должны определить. Это все, что вы хотите использовать, чтобы определить, что данные в такой-то строке.
на cbData
member-размер в байтах данных указывает 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
- проверьте, что он работает над целевым процессом (окном) [ctrl+f, Windows].
- второй фильтр сообщений set on об ошибке wm_copydata. ... и
- 'View\Always on top' также действительно удобный.
Happy C++ 'ing-особенно в C#, что API может быть реальным "весело". ;)