19

プロセス間でテキストを送信したい。私はこれの例をたくさん見つけましたが、私が働くことができるものはありません。これが私がこれまでに持っているものです:

送信部分の場合:

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つのプロセス間でテキストを送信したいと思います。

おそらく始めたばかりであることがわかるように、私はCode ::BlocksでGNUGCCコンパイラを使用しており、MFCと依存関係を回避しようとしています。

4

3 に答える 3

22

メッセージの使用方法の例については、 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...
}
于 2010-03-15T23:29:03.273 に答える
3
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;
}
于 2015-08-02T11:05:53.563 に答える
1

これは実際には答えではありませんが、SendMessage(WM_COPYDATA .. ..

さて、MicrosoftSpy++は本当に便利かもしれません。あなたはここでそれを見つけるかもしれません:

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. ターゲットプロセス(ウィンドウ)[ctrl + f、Windows]で動作していることをテストします。
  2. 2番目にWM_COPYDATAにメッセージフィルターを設定します。... と
  3. 「View\Alwaysontop」も非常に便利です。

ハッピーC++'ing-特にC#では、APIは本当の'楽しい'ことができます。;)

于 2015-10-15T12:27:23.187 に答える