プロセス間でテキストを送信したい。私はこれの例をたくさん見つけましたが、私が働くことができるものはありません。これが私がこれまでに持っているものです:
送信部分の場合:
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をどうすればよいかわかりません。
2つのプロセス間でテキストを送信したいと思います。
おそらく始めたばかりであることがわかるように、私はGNU GCCコンパイラをCode :: Blocksで使用しており、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
幸せなC++ 'ing-特にC#では、APIは本当の'楽しい 'ことができます。 ;)