Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SendMessageTimeout: Nachrichten zwischen 2 Programmen (https://www.delphipraxis.net/58986-sendmessagetimeout-nachrichten-zwischen-2-programmen.html)

VizeTE 15. Dez 2005 13:13


SendMessageTimeout: Nachrichten zwischen 2 Programmen
 
Hallo zusammen,

ich möchte beim starten von Programm A prüfen ob Programm B nicht läuft oder Programm B sein "ok" für das starten von Programm A gibt.

Mein Ansatz ist die Funktion SendMessageTimeout.
Das Timeout habe ich gewählt da Programm B zeitweise mit komplexen "SQL-Statements" beschäftigt ist und eventuell erst nach längerer Zeit reagiert. In dem Fall soll sicherheitshalber Programm A nicht gestartet werden.

Der Plan sieht so aus:
1) mit FindWindow prüfen ob Programm B da ist
2) mit RegisterWindowMessage eine MessageId holen
3) an Programm B eine Nachricht schicken ob A starten darf

Meine Problem ist wie ich die Antwort von B setze.
Der letzte Parameter von SendMessageTimeout scheint ja ein Ergebnis zurückzugeben.

Delphi-Quellcode:
LRESULT SendMessageTimeout(
    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam,
    UINT fuFlags,
    UINT uTimeout,
    PDWORD_PTR lpdwResult
);
PSDK: lpdwResult: Receives the result of the message processing. This value depends on the message sent.

Nun ist aber die Frage wie ich in Programm B diesen Parameter setzen kann.

Oder habt ihr einen anderen/besseren Ansatz?
Alternativ könnte ja Programm B wieder eine Message an Programm A senden. Falls das aber mit dem Result aus MessageSendTimeout funktioniert würde mir das ehe zusagen :zwinker:

Vielen Dank!

marabu 15. Dez 2005 15:59

Re: SendMessageTimeout: Nachrichten zwischen 2 Programmen
 
Hallo.

In Programm B wirst du die Message über einen message handler verarbeiten. Im message cracker setzt du dann das Feld Result auf den Wert, den du in deinem Protokoll festgelegt hast.

Grüße vom marabu

VizeTE 17. Dez 2005 09:43

Re: SendMessageTimeout: Nachrichten zwischen 2 Programmen
 
Zitat:

Zitat von marabu
In Programm B wirst du die Message über einen message handler verarbeiten. Im message cracker setzt du dann das Feld Result auf den Wert, den du in deinem Protokoll festgelegt hast.

mmm...wie sieht denn so ein Message Cracker aus? Ich habe die Message im Programm B verarbeitet indem ich die folgende Methode überschrieben habe.
Delphi-Quellcode:
procedure TMyControl.WndProc(var Message: TMessage);
Alternativ würde mir noch die ApplicationEvents-Komponente einfallen. Dort weiß ich aber auch nicht wie ich das Result setze. Die Methode sieht ja folgendermaßen aus:
Delphi-Quellcode:
ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean)
Ein Codeschnipsel wäre hilfreich. :wink:

Danke!

marabu 17. Dez 2005 20:15

Re: SendMessageTimeout: Nachrichten zwischen 2 Programmen
 
Hallo Daniel,

mit einem message cracker meine ich einen Record, der die für deine Nachricht typische Verwendung der einzelnen Felder in einem message record redefiniert um einen komfortableren Zugriff zu ermöglichen oder einfach sprechende Namen für die Parameter einzuführen. Beispiele für solche message cracker sind in der Unit Messages reichlich zu finden (z.B. TWMKey). Beim Studieren dieser records wird dir auffallen, dass eine message einen Standardaufbau hat. Es sind immer 4 Doppelworte. Das erste DWORD ist der message code, den du als Diskriminator in deiner Fensterprozedur verwendest. Das letzte DWORD nimmt deinen Rückgabewert auf. Die beiden in der Mitte übermitteln zusätzliche Werte für den message handler.

Ich weiß jetzt nicht, was ich dir an Code anbieten könnte, aber vielleicht sind deine Unklarheiten ja jetzt schon beseitigt?

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz