Message von einer App zu einer anderen



  • Hi Leute der Nacht,

    wie kann ich eine Message von einem prog aus zu einem anderen senden bzw. dort eine Behandlungsroutine zu der Message auslösen. Die Message habe ich selbst definiert. Muss ich diese dann in beiden Programmen definieren oder reicht die Definition in dem Prog, dass die Message empfängt.

    Gruß,

    Stalin



  • Wenn du nichts besseres findest:
    filemapping...



  • Ich bin mir supersicher, dass man Nachrichten hin und her schicken kann.

    Frag mich bitte nicht, wie - ich habe das nur mal im Quelltext gesehen, leider nicht selbst geschrieben.

    Die Threads müssen sich dafür gegenseitig kennen (ich glaube, man brauchte dafür ein CWnd*) und dann kann man Nachrichten schicken.

    Viel Erfolg beim Weitersuchen 🙂



  • Das hab ich auch schon herausgefunden. Man braucht eigentlich nur ein HWND. Aber wie finde ich das richtige?



  • FindWindow?



  • MaSTaH schrieb:

    FindWindow?

    Wenn irgendeine App hängt, hängt deine dann auch.
    Wenn sich die Titelzeile der anderen App ändert, fällst du auf die Nase.
    Außerdem bekommt man von FindWindow häßliche Pickel.

    Die "Professionelle" Lösung (die andere App muß allerdings "unter deiner Kontrolle" sein):

    1.) Finden des anderen Fensters:

    a) mit RegisterWindowMessage eine ganz privatpersönliche message registrieren. Beide Apps müssen den gleichen Namen verwenden. Ich hänge immer einen GUID an damit mir nicht irgendjemand mit dem gleichen Namen in die Quere kommt
    b) Mit EnumWindows Alle Desktop-Windows enumerieren und an diese mit SendMessageTimeout (!!) die entsprechende Message schicken. Die "Zielanwendung" sollte ihren HWND zurückgeben, andere sollten 0 zurückgeben (es sei denn man hat es mit gezielt bösartigen Anwendungen zu tun)
    Wenn man mit der "Hello" message den eigenen HWND mitgibt, kann man Daten in beide Richtungen austauschen

    2.) Daten Senden

    ab WM_APP kann man eigenen messages definieren, die "Anwendungs-Privat" sind (d.h. sie werden nicht von windows benutzt, möglicherweise aber von fremden Anwendungen. Du kannst also jederzeit an ein dir bekanntes Fenster eine WM_APP+n - Message schicken, und diese dort abarbeiten.
    Aus Sicherheitsgründen würde ich aber immer mit PostMessage oder SendMessageTimeout arbeiten. Du kannst aber nur "echte" WPARAM und "LPARAM" verwenden, keine Zeiger reinpacken!

    Vordefinierte messages können (relativ) problemlos gesendet werden.

    Wenn du mehr Daten rübergeben mußt, kannst du WM_COPYDATA verwenden.

    Ansonsten für den Austausch von Daten zwischen programmen - hemmungslos von der MSDN abgeschrieben:

    Memory mapped Files (schon erwähnt, geht super)
    COM - geht so wie's halt geht
    (Named) Pipes - geht ganz gut
    DDE
    Mailslots
    RPC - macht keinen Spaß
    Windows Sockets
    Clipboard - darf nur für "Nutzer-initiierten" Datenaustausch verwendet werden



  • Hallo,

    so jetzt kann ich von einer zur anderen was senden, aber wie kann bei WPARAM und LPARAM meine Daten die die andere App benötigt reinpacken. Mir würden zwei char* reichen.Aber laut peterchen geht das gar nicht. Also was kann ich tun? Kann ich werte auch als referenz senden und sie gefüllt wieer erhalten?

    gruß,

    Stalin



  • Als referenz geht leider nicht - zwei verschiedene Prozesse = zwei verschiedene Adreßräume (d.h. die Adressen in dem einen prozeß habe für den anderen keine Bedeutung)

    Du kannst aber WM_COPYDATA verwenden:
    du füllst ein COPYDATA struct:
    .dwData - ein (ULONG) - Parameter, z.B. 1. oder 2. String
    .lpData - void * zu den Daten (z.B. Zeiger auf String-Anfang)
    .cbData - Anzahl bytes in .lpData (z.B strlen+1 für ANSI-App, da hat man den NULL-Terminator gleich mit und läßt sich leichter Auspacken)

    Wenn die Andere Anwendung WM_COPYDATA empfängt, muß es die Daten sofort kopieren (z.B. zurück in einen CString)

    Auf die Art kriegst du mit zwei Aufrufen die Daten rüber. Wenn nötig kannst du ja auch beide Strings in einen Aufruf packen.

    ACHTUNG: Der Empfängerprozeß bekommt eine Kopie sowohl der COPYDATA Struktur, als auch der Daten hinter lpData. Diese sind nur zu lesen, und werden sofort nach dem WM_COPYDATA aufruf von Windows gelöscht. lpData darf natürlich keine Pointer enthalten.



  • Maybe this (API Guide):

    SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    
    The SendMessage function sends the specified message to a window or windows.
    The function calls the window procedure for the specified window and does not 
    return until the window procedure has processed the message. The PostMessage 
    function, in contrast, posts a message to a thread’s message queue and returns 
    immediately.
    
    Requires Windows NT 3.1 or later; Requires Windows 95 or later.
    
    · hWnd
    Identifies the window whose window procedure will receive the message. If this 
    parameter is HWND_BROADCAST, the message is sent to all top-level windows in 
    the system, including disabled or invisible unowned windows, overlapped 
    windows, and pop-up windows; but the message is not sent to child windows.
    
    · Msg
    Specifies the message to be sent.
    
    · wParam
    Specifies additional message-specific information.
    
    · lParam
    Specifies additional message-specific information.
    

Anmelden zum Antworten