Kommunikation zwischen 2 Programmen



  • Hi, ich möchte 2 Programme miteinander kommunizieren lassen (Titel) und frage mich wie ich das am besten und überhaupt umsetzen kann.
    Es sollen Strings übertragen werden, wie zum Beispiel:

    1. Programm hat eine Textbox

    2. Hat keine Oberfläche

    Ablauf (abstrakt dargestellt):
    2. Programm:

    Timer {
    Send(Programm1, "delete"); // Programm1 löscht Inhalt von Textbox
    a = HoleLaufendeProzesse();
    Send(Programm1, a); //a sieht dann z.B. so aus "explorer.exe;winlogon.exe;..."
    //Die Semikolons werden eingefügt, die Prozesse werden z.B. mit Snapshots geholt.
    //Dann wird der String an Programm1 gesandt, welches den String dann an allen Semikolons splittet und in die TextBox schreibt.
    }
    

    Danke ^^



  • Für IPC (Inter Process Communication) kommen mehrere Technologien/Mechanismen in Frage, einige sind OS oder Framework abhängig:
    - UDP, TCP/IP
    - Mail Slots
    - Named Pipes
    - Shared Memory
    - Windows Messages

    oder gerade mit "Middleware":
    - CORBA
    - COM/DCOM
    - RPC
    - .NET Remoting

    Gruss Simon



  • Danke!

    Und wie benutze ich die folgenden?

    - Mail Slots
    - Named Pipes
    - Shared Memory
    - Windows Messages

    Es wäre sehr nett, wenn mir jemand da einen kleinen Anstoss geben könnte.
    Bei Google finde ich nur spezielle Dinge (u.A. Definitionen), aber nicht, wie ich das benutzen könnte und mit welchen Funktionen...



  • Zu Shared Segments in DLLs gibts Infos im Netz, schau mal in der MSDN. Da würde ich dir aber dann den MSVC empfehlen für ein schnelles Erfolgserlebnis.

    Zu Windows Messages:

    Du hast ne Message Loop (WndProc) in Programm A und eine in Programm B.

    mit FindWindow kannst du dir nun ein Handle holen und mit SendMessage Nachrichten schicken.

    Jetzt wäre es für dich an der Zeit, dich mit den Windows Grundlagen zu befassen 😉



  • Das ist kein leichtes Thema unter Windows und setzt sehr gute Grundlagenkenntnisse voraus. So einmal im Netzt nachgefragt, geht es wohl schwer! Der sicherste Windows-konforme Weg geht über das Senden von Nachrichten, die aber nur einzelne Zeichen (integer ASCII) übertragen können. hierfür braucht man in jedem Fall die beiden Hauptfenster-Handles beider Programme. Fange mit der Aufgabe einfach selbst an und Du lernst eine Menge, was Windows macht und wie es arbeitet. 🙂



  • Wenn du window messages verwenden willst guck die WM_COPYDATA an.



  • LRESULT SendMessage(
    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
    );

    Also kann ich keine ganzen Strings verschicken?
    Dann wäre ein TCP Client/Server doch besser geeignet...

    Aber das wird doch eigentlich für remote Übertragung verwendet und ich will nur lokal etwas weitergeben 😕



  • Klar gehts auch mit ganzen Strings...

    ********************************************************

    hWnd=FindWindow(0,"ProgrammName");
                         if (hWnd!=0)
                         {
                           COPYDATASTRUCT cds;
                           char ParamCh[256];
                           ShowWindow(hWnd,SW_SHOWNORMAL);
                           SetForegroundWindow(hWnd);
                           for (int i=1;i<=ParamCount();i++)
                           {
                             strncpy(ParamCh, ParamStr(i).c_str(),sizeof(ParamCh));
                             cds.cbData=strlen(ParamCh)+1;
                             cds.lpData=ParamCh;
                             SendMessage(hWnd,WM_COPYDATA,0,(LPARAM)&cds);
                           }
                         }
    

    Sendet nacheinander alle Parameter

    **********************************************************************

    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_COPYDATA, TWMCopyData, WMCopyData);
    END_MESSAGE_MAP(TForm);
    

    **********************************************************************

    MESSAGE void TMMSearchForm::WMCopyData(TWMCopyData &Message)
    {
      AnsiString slCmdLine;
      AnsiString RotAngStr="";
      int RotAng;
      slCmdLine=(char*)Message.CopyDataStruct->lpData;
      slCmdLine = slCmdLine+"\0";
      // Mach mit slCmdline, was Du willst.
    }
    


  • @ DerAltenburger: Du sendest den String auch nur zeichenweise! Zur sauberen Übertragung braucht man noch mehr. Das empfangende Programm muss wissen, wann ein String anfängt und wann dieser endet, um das Nullzeichen anzufügen. Lasst den Fragesteller das selbst realisieren - es ist einfach.


Anmelden zum Antworten