2017-04-24 64 views
0

私は2つのウィンドウアプリケーションを持っています。まず、Windowsフォームアプリケーション。 2番目はコンソールアプリケーションです。コンソールアプリケーションからフォームアプリケーションにメッセージを送信する必要があります。私はブロードキャストメッセージを登録し、使用:: PostMessage関数は、フォームアプリケーションに数値メッセージを送信することができました。しかし、私は文字列メッセージを送ることができません。以下の私のコードを見つけてください: -PostMessageとWM_COPYDATAを使用して文字列メッセージを送信する方法

// Sending Message (Console Application) 
#define RT_UI_MSG  (WM_USER+1) 
UINT msg_id = RegisterWindowMessage("Test-UI"); 
LPTSTR lpszString = "Hello"; 
    COPYDATASTRUCT cds; 
    cds.dwData = 1; // can be anything 
    cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1); 
    cds.lpData = &lpszString; 
::PostMessage(HWND_BROADCAST, msg_id, WM_COPYDATA, (LPARAM)(LPVOID)&cds); 

//メッセージ(Formsアプリケーション) BEGIN_MESSAGE_MAP(CRTUIDlg、CDialogEx) ON_WM_PAINTを受信() ON_WM_QUERYDRAGICONを() ON_BN_CLICKED(IDOK、& CRTUIDlg :: OnBnClickedOk) ON_REGISTERED_MESSAGE (TEMP、OnRTUIMsg) ON_BN_CLICKED(IDC_BUTTON1、& CRTUIDlg :: OnBnClickedButton1) END_MESSAGE_MAP()

UINT temp = RegisterWindowMessage(L"Test-UI"); 
LRESULT CRTUIDlg::OnRTUIMsg(WPARAM wParam, LPARAM lParam) 
{ 
    COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam; 
    if (pcds->dwData == 1) 
    { 
     LPCTSTR lpszString = (LPCTSTR)(pcds->lpData); 
     // do something with lpszString... 
    } 
    return 0; 
}            

は親切に私は私が間違っているのかを理解し、この作業

+0

フォームアプリケーションでこのコードを使用してメッセージを受信しましたが、受信したデータが空で、ポインタpcds全体が空です。 – Sam

答えて

0

WM_COPYDATAを得るのを助ける次の状態:

「のデータがデータを受信するアプリケーションにアクセスできないオブジェクトへのポインタまたは他の参照を含めることはできません渡されます"

ただし、ソースアプリケーションヒープ(lpszString)へのポインタは、ソースアプリケーションのヒープにターゲットアプリケーションからアクセスできないため、サポートされていない構造体にインクルードされています。 WM_COPYDATAはそのポインタをそのままコピーしますが、ポインタによって参照される文字列はコピーされません。

私はWM_COPYDATAの例を見てみることをお勧めします。この例は、必要な処理を行っているようですが、ヒープから文字列を渡す代わりに、char配列を使用して文字列をスタックにコピーします。

これは例へのリンクです:WM_COPYDATAをのpostMessageする方法はありません https://msdn.microsoft.com/en-us/library/windows/desktop/ms649009(v=vs.85).aspx

+0

それは良い点ですが、私はその質問に関連するとは思わない。その価値については、ポスターが長さ(大体)を持っているので、 'cds.lpData =&lpszString;'を 'cds.lpData = lpszString;'に変更するだけで解決できると思います。 – pjcard

関連する問題