WM_USER: Nachricht von einem anderen Programm [ERLEDIGT]

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

WM_USER: Nachricht von einem anderen Programm [ERLEDIGT]

Beitrag von satmax »

Ein anderes Programm schickt mir eine Windows Nachricht (WM_USER_xxx). Wie kann ich diese Nachricht erhalten?

Ich habe es mal so versucht ob irgendetwas kommt:

Code: Alles auswählen

DO WHILE ! lExit
   nEvent := AppEvent(@mp1,@mp2,@oXbp)
   IF nEvent <> xbe_None .and. nEvent <> 1048626
   	 debugPrint(nEvent)
   endif
   oXbp:handleEvent(nEvent,mp1,mp2)
ENDDO
Weis nicht was 1048626 ist, habe es nur ausgefiltert weil dieser Event ständig kommt. Die Nachricht die ich erhalten sollte war aber nie dabei.
Zuletzt geändert von satmax am Di, 25. Nov 2014 10:45, insgesamt 1-mal geändert.
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von brandelh »

Das Konzept von Xbase++ sieht vor, dass es nur "erwünschte" Events von Windows durchreicht, also jede Menge im Hintergrund abgeblockt werden.
Man kann aber selbst Ereignisse (also Events) generieren wenn man diese selbst aus der Xbase++ Anwendung sendet.
Ob das von einer an einer andere EXE geht, habe ich nie probiert.

Vermutlich müsstest du direkt die Windowsevents abfragen um deinen WM_USER_xxx Event zu erhalten.
Ich meine in der ot4xb ist eine Funktion die das kann, als Ersatz für AppEvent(@mp1,@mp2,@oXbp)
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von Tom »

Das fragliche - gefilterte - Event dürfte das Resizing-Event sein:

http://news.alaska-software.com/readmes ... %2B%2B.gui
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von brandelh »

Wie kommt man auf die Event-Nummer ?

=> AppEvent.ch

Code: Alles auswählen

// Base Event Wert, alle XBP Event Codes sind > xbeB_Event
//
#define xbeB_Event                     1048576
...
#define xbeP_Resize                    (049 + xbeB_Event)
#define xbeP_Paint                     (050 + xbeB_Event)
Einfacher Weg manuell: nEvent - xbeB_Event => Wert in Tabelle suchen ;-)

1048626 - 1048576 = 50 ... also nicht resize, sondern paint ;-)

im Code der Eventschleife könnte man natürlich auch gleich die Konstanten verwenden:

Code: Alles auswählen

do case
   case nEvent = xbeP_Resize
   case nEvent = xbeP_Paint
...
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von Herbert »

brandelh hat geschrieben:im Code der Eventschleife könnte man natürlich auch gleich die Konstanten verwenden:
Hubert, man muss! Wie willst du sonst lesbaren Code erstellen?
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

Danke für Deine Erklärung Hubert. Darum habe ich auf die schnelle mit der Textsuche den Code 1048626 nicht gefunden. :)

@Herbert,
klar muss man das! Das war nur ein Versuch um beim Debuggen einen speziellen Event zu finden, was mir aber nicht gelungen ist...

@all
Wenn Xbase das aber nicht sauber handelt, wäre es eventuell eine Überlegung gleich Socktes für die Kommunikation zweier Programme zu verwenden (beides Win32 aber unterschiedliche Entwicklungssysteme)? Aber für die Sockets braucht man wieder die Professional...
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von brandelh »

Herbert hat geschrieben:
brandelh hat geschrieben:im Code der Eventschleife könnte man natürlich auch gleich die Konstanten verwenden:
Hubert, man muss! Wie willst du sonst lesbaren Code erstellen?
du hast Recht, wenn man auf den Event reagieren will, ich habe oben aber erklärt, wie man von einer ermittelten Nummer (nEvent) zu dem Eventnamen kommt. Das geht auch per Hand ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von AUGE_OHR »

satmax hat geschrieben:Ein anderes Programm schickt mir eine Windows Nachricht (WM_USER_xxx). Wie kann ich diese Nachricht erhalten?
in dem du einen Event per o:subscribeEvent() über die COM Schnittstelle "abonnierst".
nun ist ein Event nicht alles ... meistens gehören auch "Daten" dazu.

Xbase++ belegt Callback-Slots mit Codeblock und die "Daten", welche du aus C übergeben musst, kommen als Parameter zwischen den beiden "|".
mit ot4xb kannst du auch einen Callback-Slot bauen und durch den "Callback-Compiler" (xppcbk.exe ) jagen und als OBJ einbinden.
gruss by OHR
Jimmy
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

Hallo Jimmy,

Du meinst so ähnlich:

Code: Alles auswählen

#define MSG_TEST 1094
oObj := ActiveXObject():create( "xxx" )
IF oObj != NIL
	oObj:subscribeEvent(MSG_TEST, {|nL,nR| myWmMsg(nL,nR)} )
ENDIF	
Nur, woraus erstelle ich mein ActiveXObject? Was setzte ich für "xxx" ein? Ich denke da ist die USER32.dll im Spiel.

Oder liege ich da total falsch?
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von brandelh »

Jimmy's Lösung geht wohl davon aus, dass Xbase++ eine ActiveX Verbindung zu deinem Programm hat.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

Ich habe das ganze jetzt mal kurz mit den Sockets angetestet, das funktioniert auf Anhieb. Wäre eigentlich die offener Lösung und würde mir mehr gefallen. Gemacht habe ich es mit den Xbase++ Socket Funktionen. Warum funktionieren die bei mir, habe ja keine professional ???

Womit ich bei der nächsten Frage wäre, Xbase++ Socket und auf professional upgraden, oder Xb2.net? Auf dem Papier sieht Xb2.net für mich etwas professioneller aus.
Gruß
Markus
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von Wolfgang Ciriack »

Für alle Socket-, Soap- oder FTP-Sachen nehme ich XB2.Net, funktioniert hervorragend und Boris leistet auch guten Support.
Viele Grüße
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von AUGE_OHR »

satmax hat geschrieben:Ich habe das ganze jetzt mal kurz mit den Sockets angetestet, das funktioniert auf Anhieb. Wäre eigentlich die offener Lösung und würde mir mehr gefallen.
wäre gut wenn du sagst "was" du machen möchtest ?
gruss by OHR
Jimmy
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

Ich versuche es:
im ersten Schritt übergebe ich einen Parameter 4711.0000 an ein anderes Programm (von uns). Dieses Programm führt nun Berechnungen durch und schreibt das Ergebnis in unsere SQL DB und schickt mir eine Nachricht fertig damit ich die Daten neu einlesen kann.

2. Möglichkeit: ich erstelle eine ASCII Datei und sende eine Nachricht an ein anderes Programm damit diese Daten verarbeitet werden, wenn dieses Programm fertig ist erhalte ich eine Nachricht.

3. Möglichkeit, ich schreibe in die SQL DB und verständige ein anderes Programm. Hier wäre es auch manchmal von Vorteil die Nachricht an einen Server zu senden (auch da läuft ein Programm von uns).

Grob und abstrakt skizziert.
Gruß
Markus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von AUGE_OHR »

satmax hat geschrieben:Grob und abstrakt skizziert.
das hört sich doch schon recht exakt an.
wenn du dich auf der Ebene bewegen willst empfehle ich dir WM_COPYDATA
anbei 2 Beispiele wie er einen externen Callback Slot bereitstellt.

p.s. mehr Beispiele gibt es bei Pablo Botella Navarro auf seiner Website http://www.xbwin.com
Dateianhänge
TestSkype.zip
benötigt ot4xb
(3.99 KiB) 272-mal heruntergeladen
TestWmCopyData.zip
benötigt ot4xb
(5.99 KiB) 342-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von brandelh »

die Sockets waren früher in der ASINET (Prof. Sub) ab 2.00 sind die aber in der normalen Sub enthalten.
Die kannst du auf jeden Fall nehmen ohne Zusatztools.

Xb2.NET ist schon lange im Markt, viele hier schwören auf die gebotenen Funktionen, welche weit über die Prof. Sub. / ASINET hinausgehen.
Ich selbst nutze sie nicht, für eMail war mit die Asinet gut genug, mehr brauchte ich nicht.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

@Danke Jimmy, da gibt's wieder viele zu lernen bei Deinen Beispielen. Das geht dann aber nur lokal und nicht auch übers Netzwerk, oder?

@Hubert
Ich bin nur etwas verunsichert weil in der Hilfe bei allen Socket* Funktionen "Professional" in der ersten Zeile steht. Muss ich wohl bei Alaska nachfragen.
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von brandelh »

satmax hat geschrieben:@Hubert
Ich bin nur etwas verunsichert weil in der Hilfe bei allen Socket* Funktionen "Professional" in der ersten Zeile steht. Muss ich wohl bei Alaska nachfragen.
da hast du Recht, aber ich habe das in einer der vorherigen Versionen unter Änderungen gelesen ... ich meine damals stand oben nicht Proffesionell ...

Aber auf jeden Fall steht unten unter Abhängigkeiten:
socket.ch
Static library
xpprt1.lib
Dynamic library
xpprt1.dll
und das ist die Basis DLL überhaupt
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

Hallo Hubert,

hier die Antwort von Alaska:
Die Socket Funktionen (ehemals in der asinet1c.dll) gehören zum
Professional Umfang. Insoweit ist die Dokumentation korrekt. Eine
Nutzung dieser Funktionen mit einem Foundation Produkt ist ein
Verstoß gegen die Lizenzbestimmung.

Dass die Funktionen gegenwärtig von einem Foundation Produkt
heraus nutzbar sind, hat technische Gründe die künftig beseitigt
werden.

Ich hoffe das hilft Ihnen weiter.

Mit freundlichen Grüssen,
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

Ich habe jetzt etwas mit WM_Copy gespielt und das funktioniert prinzipiell (dank Jimmys Beispiele). Nur muss mein gegenüber dazu sein VC++ Programm anpassen und der ist nun bis Dienstag auf Urlaub.

Warum tendiere ich nun doch wieder mehr zur Windows Message, es ist der Terminalserver, wenn ich da 30 User haben, brauche ich auch 30 Verschiedenen Ports damit sich die Sessions nicht in die quere kommen. Also müsste ich auch eine Art Portverwaltung programmieren. Außerdem müsste ich mir die Socket-Lib erst kaufen.
Gruß
Markus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von AUGE_OHR »

satmax hat geschrieben:Warum tendiere ich nun doch wieder mehr zur Windows Message ...
WM_COPYDATA ist eine Windows Message ...
gruss by OHR
Jimmy
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm

Beitrag von satmax »

Ja, das ist mir klar JImmy, durch dein Beispiel bin ich ja wieder auf WIN_MSG gekommen, ist für diesen Fall besser, den anderen Fall werde ich vermutlich mit Sockets lösen.
Ich meinte mit WM_Copy eigentlich WM_COPYDATA.
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: WM_USER: Nachricht von einem anderen Programm [ERLEDIGT]

Beitrag von satmax »

Das Beispiel TestWmCopyData.zip passt perfekt. Damit bekomme ich auch die normalen WM_USER_* Nachrichten in meinem Xbase++ Programm.

Mit einem Klick
rufe ich ein anderes Programm auf bzw. schicke nur eine WM_USER* MSG an das andere Programm,
dieses Programm führt Berechnungen durch, schreibt die Werte in die SQL DB, schickt mir eine WM_MSG das es fertig ist,
mein Programm aktualisiert die Werte aus der DB und zeigt die Daten im aktuellen Auftrag an.

Der Trick ist praktisch die CallBack Function in Verbindung mit dem via DllExecuteCall erstelltem (hidden) Windows Fenster, das nun wirklich alle Windows-Nachrichten erhalten kann. Die Vergabe und das Arbeiten mit der UUID macht zudem unabhängig vom Titel des Fensters.
Gruß
Markus
Antworten