typedef struct {
DWORD dwData; // 32-bit DataItem
DWORD cbData; // Size of lpData
PVOID lpData; // Data
} COPYDATASTRUCT;
Die Struktur übergibt in dwData einen 32-Bit Wert als DataItem an den Empfänger. Die eigentlichen Daten, deren Größe durch cbData spezifiziert wird, werden über den Zeiger lpData referenziert.
Die Übergabe der Daten muß jedoch zwangsweise per SendMessage() erfolgen; PostMessage() kann nicht eingesetzt werden. Des weiteren muß der empfangende Prozeß die Daten als Read-Only auffallen und deren Gültigkeit nur für die Dauer des Messagehandlings voraussetzen.
Der folgende Code zeigt beispielhaft eine Aufrufsequenz, bei der eine Message mit Text, Zeilennummer und Farben in der benutzerdefinierten Struktur MsgCmd abgelegt und übergeben wird.
int CIpcSendDlg::SendIpcMsg(int cmd, int line,
COLORREF fgclr, COLORREF bgclr,
ccp txt)
{
MsgCmd msg;
msg.command = cmd;
msg.line = line;
msg.fgcolor = fgclr;
msg.bgcolor = bgclr;
strcpy( msg.text, txt, MSGCMD_TEXTSIZE );
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof( msg );
cds.lpData = &msg;
return ::SendMessage(m_hWndRecv, WM_COPYDATA,
(WPARAM) m_hWnd, (LPARAM) &cds );
}
Der Empfänger übernimmt die Daten im Eventhandler.
BOOL CIpcRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pData)
{
if( pData->cbData == sizeof( MsgCmd ) )
{
MsgCmd msg;
memcpy(&msg, pData->lpData, sizeof( MsgCmd ) );
// Nachricht verarbeiten
return TRUE;
}
return CDialog::OnCopyData(pWnd, pData);
}
|