Programmieren mit C++

Visual C++

Systemnahe Lösungen mit VC++

Informationen zwischen Prozessen austauschen

Wie können Informationen und Daten zwischen zwei unabhängigen Prozessen ausgetauscht werden?

Frage

Es gibt mehrere Möglichkeiten, eine Kommunikation zwischen zwei Prozessen durchzuführen. Eine der naheliegendsten ist der Einsatz der API-Funktion SendMessage() mit der Nachricht WM_COPYDATA. Hierbei lauten die Parameter:

Lösung

SendMessage(hwReceiver,          // Empfänger
            WM_COPYDATA,         // Message
            (WPARAM) hwSender,   // Absender
            (LPARAM) pData);     // Daten

Die tatsächlichen Daten werden im LPARAM übergeben. Der Zeiger pData zeigt dabei auf eine Struktur vom Typ COPYDATASTRUCT, die wie folgt definiert ist:

Nachricht WM_COPYDATA

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); 
}

Struktur COPYDATA-STRUCT





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:22:56 von textarchiv.alojado.de