Das nächste Entwicklertreffen findet Anfang Mai in Münster statt - weitere Infos bzw. zur Anmeldung!

2 Applikationen, springen von einer in die andere

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 420
Registriert: Mo, 30. Mai 2011 15:06

2 Applikationen, springen von einer in die andere

Beitrag von Benz » Mi, 13. Dez 2017 12:13

Hallo,

Ich habe 2 Applikationen, einen in C# geschrieben, die andere in Xbase++. Nun würde ich gerne von der C# Applikation an einer bestimmten Stelle, also beispielsweise, wenn man einen Button klickt, in eine bestimmte Stelle der Xbase++ Applikation springen, also dass sich beispielsweise ein Fenster öffnet und ein bestimmter Datensatz geladen wird, dessen Nummer aus der C# Applikation übernommen wird.
Das ganze soll ebenfalls anders herum funktionieren.

Frage 1: Angenommen ich mache das mit Runshell von Xbase auf C#, wie kann ich dann sicherstellen, dass nicht eine neue Instanz der C# Applikation geöffnet wird, sondern innerhalb der bereits geöffneten Instanz auf die eine Stelle gesprungen wird, die ich gerne haben möchte?

Frage 2: Runshell ist wahrscheinlich nicht die beste Lösung, was würdet ihr empfehlen? Hat jemand eine Idee?

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14633
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: 2 Applikationen, springen von einer in die andere

Beitrag von brandelh » Mi, 13. Dez 2017 12:39

Deine Beschreibung oben meint, dass die C# Anwendung die Xbase++ steuern soll,
die untere meint mit runshell() C# Anwendung aus Xbase++ heraus starten. Das widerspricht sich ;-)

Es gibt API Befehle, die das Fenster einer Anwendung per Name suchen und ein Handle zurück geben.
Mit diesem könnte man events auslösen, das sollte die beste Vorgehensweise sein. Gemacht habe ich das aber noch nicht.

Ansonsten bleibt eine Steuerung über z.B. Dateien ... Eine Anwendung wartet auf Dateien in einem Verzeichnis.
Wenn eine kommt, Infos lesen und ausführen ... das können Daten oder auch Steuerinfos sein.
Gruß
Hubert

Benutzeravatar
HaPe
Foren-Moderator
Foren-Moderator
Beiträge: 562
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: 2 Applikationen, springen von einer in die andere

Beitrag von HaPe » Mi, 13. Dez 2017 13:04

Hallo Benz !
Das ganze soll ebenfalls anders herum funktionieren.
Das geht mittels IPC (Inter-Prozess-Communication).
Kurz beschrieben:
- Das C#-Programm startet dein Xbase++-Programm mittels der Win32Api-Funktion CreateProzess (asynchron).
- Das C#-Programm bestimmt über die ProzessID des Xbase++-Programmes dessen WindowHandle.
- Das Xbase++-Programm stellt einen Event-Handler für das Abarbeiten der Windows-Nachrichten an dessen WindowHandle zur Verfügung; das C#-Programm macht das ebenfalls.
- Das C#-Programm sendet eine spezielle Nachricht mit Informationen wie das WindowHandle des MessageEvent-Handlers an das Xbase++-Programm.
- Jetzt hat jeder der Beteiligten das WindowHandle für Nachrichten des Gegenüber. Damit können Nachrichten ausgetauscht werden per SendMessage.
- Die Kommunikation mit Daten/Anweisungen kann per WM_COPYDATA mit SendMessage, über SharedMemory oder auch per File-IN/OUT erfolgen.
- "Angestubst" wird immer mittels SendMessage und der jeweilige Event-Handler liest die Daten entsprechend aus.
- Die Daten können Anweisungen welches Fenster zu Öffnen ist, welcher Wert wo einzutragen ist usw. enthalten.

OK, die Umsetzung ist nicht ganz trivial, funktioniert dann allerdings zuverlässig.
Ich habe das bisher nur für VFP-Programme untereinander im Einsatz, die Verwendung mit C#-Programmen kommt demnächst ...
--
Hans-Peter

Organisator der XUG Stuttgart
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Do, 14. Dez 2017 2:17

das was Hape beschreibt ist der "richtige" Windows API Weg :!:
ich fürchte jedoch das nur wenige User des Forum das verstanden haben da es "jenseits" von Xbase++ liegt.

das mit den "Fenster" Handle ist wohl noch verständlich aber bei Windows Events wie WM_COPYDATA ... :roll:
ich hänge mal ein Beispiel von Pablo mit ot4xb anbei.
TestWmCopyData.zip
need ot4xb
(2.19 KiB) 45-mal heruntergeladen
---

die Windows Event Queue "ist" der Kanal womit Apps / Controls "kommunizieren".
ein Control kann nur "innerhalb" einer App "kommunizieren" -> kann keine "externe" App erreichen.
wenn muss eine App mit einer App "kommunizieren" wie z.b. beim DragDrop von einer App in eine andere App.

---

man kann zwar "in" eine Xbase++ App etwas "droppen" aber "aus" der App kann man nicht in eine andere App "draggen"
es gibt aber durchaus Möglichkeiten das zu simulieren z.b. ein "drag" in ein externes "EDIT" Control oder dem "auslösen" eines "Button"

zunächst muss man das Handle des Fenster ermitteln was das "Targe" (Ziel) sein soll. das könnte man z.b. über die Tastlist.

bei einem "Drog" befindet sich die Maus auf der End-Position. mit

Code: Alles auswählen

nHwnd := @User32:WindowFromPoint( aDropPos[ 1 ], aDropPos[ 2 ] )
bekommt man das Handle zu dem Fenster unter der Maus Position.

nun muss man nach dem Control suchen was man ansprechen will

Code: Alles auswählen

hButton := @User32:FindWindowExA(nHwnd,0,"BUTTON","Show &input video"+Chr(0))
da ich sowohl die CLASS ( "BUTTON") als auch die Caption ("Show &input video") angebe erhalte ich sofort den Treffer.

man beachte das "&input" was unter Xbase++ "~input" lauten müsste für den selben Effekt : "unterstrichen"
als Tool sei WinID (www.dennisbabkin.com/winid) empfohlen womit man solche Informationen bekommt.

neue Caption setzen (auch "EDIT")

Code: Alles auswählen

@User32:SendMessageA(hButton,WM_SETTEXT,LEN(cCaption),cCaption+CHR(0))
"externen" Button auszulösen

Code: Alles auswählen

@User32:SendMessageA(hButton,BM_CLICK, 0, 0)
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » Sa, 06. Jan 2018 15:51

Aua-aua-aua.

--- snip ---
die Windows Event Queue "ist" der Kanal womit Apps / Controls "kommunizieren".
--- snap ---

Es gibt keine "Windows Event Queue". Es gibt eine Hardware Event Queue und jede Menge Thread Event Queues, die eigentlich keine lupenreinen Queues sind. Und SendMessage ist genau der Kandidat, der gerne mal diese Queue umgeht.

--- snip ---
ein Control kann nur "innerhalb" einer App "kommunizieren" -> kann keine "externe" App erreichen.
--- snap ---

Was ist eine App? Wie kommuniziert ein Control? Was ist "extern"?

----
wenn muss eine App mit einer App "kommunizieren" wie z.b. beim DragDrop von einer App in eine andere App.
----

Was ist eine App?

Was die Messages angeht, die Du über Prozessgrenzen hinweg schickst, hast Du jede Menge Glück, die zu erwischen, die das Betriebssystem marshalled. Das geht auch nicht für alle Controls, die das BS bietet, und schon gar nicht für solche, die man selber oder jemand anders gebastelt hat. Finger weg von so Zeug.

Es gibt Messages, die explizit für die Verwendung über Prozessgrenzen hinweg gedacht sind (e.g. WM_COPYDATA), die darf man natürlich nutzen.

Für Drag & Drop gibt es Regeln, die man einhalten sollte. Einfach mal mit WM_SETTEXT reinballern, was man für richtig hält, ist schlechtes Benehmen.

Viele Grüße
Michael

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Sa, 06. Jan 2018 22:00

hi mike,
ein frohes neues Jahr wünsche ich dir.
mikehoffmann hat geschrieben:
Sa, 06. Jan 2018 15:51
Für Drag & Drop gibt es Regeln, die man einhalten sollte. Einfach mal mit WM_SETTEXT reinballern, was man für richtig hält, ist schlechtes Benehmen.
kann Cockpit "echtest" DragDrop "aus" Xbase++ "in" eine andere App :?:

wenn Ja dann "zeige" und doch mal ein Beispiel was wir alle verwenden können :!:
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » So, 07. Jan 2018 12:44

Hallo Jimmy,

auch Dir alles Gute im Neuen Jahr, Gesundheit, Glück und Zufriedenheit. Viele schöne Ausritte mit deinem Moped und arbeite nachts nicht mehr so lange.

Ich fände es gar nicht schlecht, wenn Du auch meine Fragen beantworten würdest. Nun aber zu Deinen.

--- snip ---
kann Cockpit "echtest" DragDrop "aus" Xbase++ "in" eine andere App?
--- snap ---

Bitte nicht so viele Gänsefüße und undefinierte Begriffe. Wenn Deine Frage "Kannst Du Drag&Drop-Operationen mit Cockpit initiieren?" lautet, dann ist die Antwort: Ich sehe keinen Hinderungsgrund. Einfach DoDragDrop aufrufen und die erforderlichen COM-Objekte implementieren. Ein Drop-Target habe ich schon implementiert.

--- snip ---
wenn Ja dann "zeige" und doch mal ein Beispiel was wir alle verwenden können!
--- snap ---

Das wäre möglich, würde aber die Welt in ihrem Lauf nicht ändern. Diese Aufgabe fällt nativ den Bewohnern der Nordwestspitze des amerikanischen Kontinents zu.

Viele Grüße
Michael

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » So, 07. Jan 2018 21:00

mikehoffmann hat geschrieben:
So, 07. Jan 2018 12:44
Ein Drop-Target habe ich schon implementiert.
das hat Xbase++ schon in der v1.9x ( WS_EX_ACCEPTFILES -> o:DropZone := .T. )

hier ot4xb Demo mit paar Zeilen Code und einem CRT
DROP2.ZIP
need ot4xb
(583 Bytes) 45-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » Di, 09. Jan 2018 0:22

Hallo Jimmy,
das ist Schwachstrom-Drag&Drop durch die Hintertür, das Files aus der Shell annimmt. Mit echtem (=OLE) D&D hat das nix zu tun. Dafür braucht's ein IDropTarget-Interface auf der Empfängerseite.
Viele Grüße
Michael

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Di, 09. Jan 2018 6:07

mikehoffmann hat geschrieben:
Di, 09. Jan 2018 0:22
das ist Schwachstrom-Drag&Drop durch die Hintertür, das Files aus der Shell annimmt.
hab ja nie behauptet das Alaska "Starkstrom" produzieren würde :badgrin:
mikehoffmann post hat geschrieben:Mit echtem (=OLE) D&D hat das nix zu tun. Dafür braucht's ein IDropTarget-Interface auf der Empfängerseite.
hast du ein (verständliches) Beispiel wie man z.b. ein Outlook Attachment "in" eine Xbase++ App ziehen kann :?:
und wie sieht es anders-rum aus also von einer Xbase++ App in eine andere Windows App ?

App = Programm

---

die meisten User in diesem Forum haben IMHO "keine Ahnung von Windows API" ... deshalb versuche ich es mit "einfachen" Worten zu erklären. ich verwende deshalb den Begriff "Windows Event Queue", im Gegensatz zur "Xbase++ Event Queue", wo sich die WM_* "Notify Events" "tummeln" die ich "abfangen" möchte um aus Xbase++ darauf zu reagieren (meistens mit Xbase++ Userdef Events)

auch interessiert es die User meisten gar nicht was im Detail passiert ... oder (Sicherheits) Problem wenn man es "falsch" verwendet solange es "funktioniert". So stellt für mich die Kombination von FindWindowExA() / SendMessageA() mit BM_CLICK kein "Problem" da auch wenn anderen meinen es wäre "schlechtes Benehmen".

sicherlich ist es eleganter per TAPI ein FAX zu versenden aber im Grunde reicht es die Rufnummer, per WM_SETTEXT, in das Eingabe Feld des Dailer zu bringen und den "OK" Button zu klicken.

---

Hubert sprach von einer "simplen" Möglichkeit z.b. durch anlegen einer Datei die etwas "signalisiert".
die Datei "könnte" (Text) Informationen enthalten um Befehle auszuführen um z.b. aus dem Clipboard was zu entnehmen.

HaPe sprach nun davon wie man es "richtig" machen müsste mit 2 Windows Apps ... die sollten direkt "kommunizieren"
das erfordert jedoch Windows API Kenntnisse welche über den Stand eines "einfachen" Xbase++ User hinausgeht.

mein Vorschlag liegt dazwischen und hätte den Vorteil das man keinen Thread zu "lauschen" benötigt.

wenn ich auf einen Button klicke "suche" ich die andere App, dann das Control auf der Form ( ähnlich DrawingArea:Childlist() ) und dann die Aktion z.b. "füllen" eines "WC_EDIT" (SLE) Control. bei einem Bitmap könnte man über das Clipboard gehen und in der anderen App "Strg-V" simulieren.

klar das so ein "Benehmen" gefährlich werden "kann" ... aber solange es ohne (sichtbaren) Probleme funktioniert ... :-"
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » So, 14. Jan 2018 14:15

... hat etwas gedauert, ich will ja keinen Mist erzählen.

--- snip ---
hab ja nie behauptet das Alaska "Starkstrom" produzieren würde.
--- snap ----

Die haben in diesem Fall mit der Stromsärke nichts zu tun, denn das ist API-Rufcode.

--- snip ---
hast du ein (verständliches) Beispiel wie man z.b. ein Outlook Attachment "in" eine Xbase++ App ziehen kann
--- snap ---

Ich habe ein Beispiel geschrieben, deswegen hat meine Antwort so lange gedauert. Aber das Thema ist etwas komplexer. Wenn Du Dich als Drag&Drop-Empfänger registrierst, dann kommen da viele bunte Sachen an und Du musst entscheiden, was Du annehmen kannst. Ob nun Outlook oder Excel oder Word oder ein anderes Programm der Ursprung Deiner Daten ist, kratzt Dich da erst mal nicht.

Außerdem kann es sein, dass nicht nur eine Mail auf Deine Anwendung geworfen wird, sondern gleich mehrere. Das gilt es zu berücksichtigen.

Wenn Du das verstanden und Dich durch die Clipboard-Formate der Office-Programme gekämpft und gegoogelt und geweint hast, dann kannst Du zu Werke gehen und Dein COM-Objekt schreiben, das ein IDropTarget Interface implementiert. Dieses muss sich dann noch mit RegisterDragDrop beim Betriebssystem registrieren.

In der IDroptarget:Drop - Methode geht es dann zur Sache: Rausfinden, was der Benutzer alles an seinem Mauszeiger hängen hat und ebendieses abgreifen, wenn es nach unserem Gusto ist. Dafür bekommt man das IDataObject Interface abgeliefert. Im E-Mail-Fall kriegen wir die Daten hieraus via IStorage Interface und im Fall, dass mehrere Mails abgeworfen werden, kann man sich ein IStorage Interface nach dem anderen abholen.

Damit hat man schon mal den Zugang zu allen Daten und bekommt sogar einen Dateinamen für die Daten geliefert, der bei einer Outlook-Mail mit ".msg" endet. Mit den Daten kann man nun was anstellen und man könnte sie z.B. in eine Datei schreiben. Das ist auch gar nicht schwer, denn man erzeugt sich einfach eine DocFile-Datei mit einem IStorage Interface und in diese kopiert man dann die Outlook-Mail-Daten locker flockig, denn IStorage bietet ja die Methode CopyTo. Welch eine Glück.

So schafft man es in nullkommanichts eine .msg-Datei aus einer gedroppten Mail zu erzeugen. Ab da müsstet Ihr mit plain vanilla Xbase klarkommen, z.b. um an den Anhang zu kommen. Das sollte aber noch viel schöner gehen mit der Funktion OleCreateFromData, aber die habe ich noch nicht erfolgreich ausprobiert.

Da Du bei dem gewünschten Beispiel das Attribut "verständlich" auf .T. haben möchtest, zeige ich es hier nicht und beantworte Deine Frage mit: "Nein, das geht nicht."

--- snip ---
und wie sieht es anders-rum aus also von einer Xbase++ App in eine andere Windows App ?
--- snap ---

Grundsätzlich kein Problem, für normale Cipboard-Formate locker, wenn man aber volles OLE implementieren möchte, könnte das wirklich Arbeit und viele Tränen bedeuten. Und da gibt es vielleicht auch Grenzen des Machbaren

--- snip ---
App = Programm
-- snap ---

Dann sag doch Programm.

--- snip ---
die meisten User in diesem Forum haben IMHO "keine Ahnung von Windows API" ... deshalb versuche ich es mit "einfachen" Worten zu erklären. ich verwende deshalb den Begriff "Windows Event Queue", im Gegensatz zur "Xbase++ Event Queue", wo sich die WM_* "Notify Events" "tummeln" die ich "abfangen" möchte um aus Xbase++ darauf zu reagieren (meistens mit Xbase++ Userdef Events)
--- snap ---

Es gibt keine "Windows Event Queue" und eine hypothetische hilft einem auch nicht. Die vielen Gänsefüßchen sind ein Indikator, dass das für Dich auch etwas nebulös ist. Ist es aber nicht. Wenn man die Fakten kennt.

--- snip ---
auch interessiert es die User meisten gar nicht was im Detail passiert ... oder (Sicherheits) Problem wenn man es "falsch" verwendet solange es "funktioniert". So stellt für mich die Kombination von FindWindowExA() / SendMessageA() mit BM_CLICK kein "Problem" da auch wenn anderen meinen es wäre "schlechtes Benehmen".

sicherlich ist es eleganter per TAPI ein FAX zu versenden aber im Grunde reicht es die Rufnummer, per WM_SETTEXT, in das Eingabe Feld des Dailer zu bringen und den "OK" Button zu klicken.

Hubert sprach von einer "simplen" Möglichkeit z.b. durch anlegen einer Datei die etwas "signalisiert".
die Datei "könnte" (Text) Informationen enthalten um Befehle auszuführen um z.b. aus dem Clipboard was zu entnehmen.

HaPe sprach nun davon wie man es "richtig" machen müsste mit 2 Windows Apps ... die sollten direkt "kommunizieren"
das erfordert jedoch Windows API Kenntnisse welche über den Stand eines "einfachen" Xbase++ User hinausgeht.

mein Vorschlag liegt dazwischen und hätte den Vorteil das man keinen Thread zu "lauschen" benötigt.

wenn ich auf einen Button klicke "suche" ich die andere App, dann das Control auf der Form ( ähnlich DrawingArea:Childlist() ) und dann die Aktion z.b. "füllen" eines "WC_EDIT" (SLE) Control. bei einem Bitmap könnte man über das Clipboard gehen und in der anderen App "Strg-V" simulieren.

klar das so ein "Benehmen" gefährlich werden "kann" ... aber solange es ohne (sichtbaren) Probleme funktioniert ... :-"
--- snap ---

Du und Deine Gänsefüßchen...

Nochmal: Man tut das nicht. Wenn Du mühselig ein Eingabefeld gebastelt hast, z.B. das eine Uhrzeit mit Doppelpunkten erwartet und auch dafür sorgt, dass keine Buchstaben vom User eingegeben werden können, und da kommt so ein Schurkenprogramm und ballert Dir "ABCDEFG" rein, freust Du Dich dann?

Das wäre für mich Grund genug, mal schnell ein WM_QUIT in die andere Richtung zu schicken. (Über die Thread Message Queue des Absenders natürlich. Würde bei Xbase übrigens nicht funktionieren, da braucht es drastischere Massnahmen.)

Eine etwas sauberere Möglichkeit, die nebenbei noch das Ausfüllen von Nicht-Edit-Controls (z.B. Eingabefelder im Browser) möglich macht, geht so:
Hotkey mit dem Betriebssystem registrieren und dann den Anwender diesen Hotkey im Zieldatenfeld drücken lassen. Auf dieses Kommando hin dann über die Hardware Event Queue Buchstabe für Buchstabe auf die Reise schicken. Geht echt cool. Oder die Daten (z.B. ein Array) ins Clipboard stellen und dann Strg-V schicken. Wenn die Applikation auf der anderen Seite (und das kann z.B. auch über einen Browser gehen) dann solche Daten erwartet, sind die -zack- drüben. Ich befülle so z.B. SAP-Masken, die über siebzehn Ecken und am Ende einen Browser auf dem PC zu bearbeiten sind.

Viele Grüße
Michael

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » So, 14. Jan 2018 21:07

mikehoffmann hat geschrieben:
So, 14. Jan 2018 14:15
... hat etwas gedauert, ich will ja keinen Mist erzählen.

Ich habe ein Beispiel geschrieben, deswegen hat meine Antwort so lange gedauert.
dann zeig uns doch mal "was" ...
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » Di, 16. Jan 2018 18:03

Nö, weil Du nicht zuhörst.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Di, 16. Jan 2018 18:27

mikehoffmann hat geschrieben:
Di, 16. Jan 2018 18:03
Nö, weil Du nicht zuhörst.
also alles nur heisse Luft :lol:
gruss by OHR
Jimmy

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 13159
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: 2 Applikationen, springen von einer in die andere

Beitrag von Jan » Di, 16. Jan 2018 18:29

Bestimmt nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Di, 16. Jan 2018 18:42

@Jan : du glaubst ja auch was Alaska sagt ... [-X
ich glaube es erst wenn ich eine funktionierende Demo in der Hand halte ... das kann noch Jahr dauern :roll:

aber egal es geht ja hier um ein anderes Thema und auf eine (weiter) Antwort darauf warte Benz.
also wenn du was zu sagen hast dann bitte zu "diesem" Thema, Danke
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » Di, 16. Jan 2018 20:02

Antwort an Jan: Du hast Recht.

Antwort an Jimmy: Was bietest Du?

Antwort an Benz: Bau doch mit C# ein COM-Objekt mit einem IDispatch-Interface und einem Outgoing(-IDispatch)-Interface. Dann koppelst Du die beiden Applikationen aus Xbase heraus.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Di, 16. Jan 2018 20:12

mikehoffmann hat geschrieben:
Di, 16. Jan 2018 20:02
Antwort an Jimmy: Was bietest Du?
soll das jetzt ein Wettstreit werden ?
wenn du öfter im Forum wärst würde du wissen was ich "anbiete"
Bau doch mit C# ein COM-Objekt mit einem IDispatch-Interface und einem Outgoing(-IDispatch)-Interface.
Dann koppelst Du die beiden Applikationen aus Xbase heraus.
jetzt muss du ihm nur noch erklären "wie" man das macht denn das ist das was die User gerne wissen wollen.

es gibt dazu einen Thread von mir im Forum wie eine DotNet COM erstellt die man unter Xbase++ einbinden kann.
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » Mi, 17. Jan 2018 18:56

soll das jetzt ein Wettstreit werden ?
Nö. Aber wenn Du unterstellst, ich blöffe, musst Du schon was auf den Tisch legen, wenn Du sehen möchtest.

Inzischen enumeriere ich übrigens auch die Ole Verbs für die E-Mail. So kann ich die E-Mail aus meiner Anwendung heraus anzeigen lassen und ich kann die Properties ändern.

Und nun das Beste: Durch dieses Testprogramm habe ich endlich eine prima Verwendung für alle Spam-Mails. Das Testprogramm verschluckt sie gerne. Ich hätte es nicht geglaubt, dass auch Spam-Mails eine Daseinsberechtigung haben. Das wäre doch eine Idee für eine hochwertvolle "App". Man kann seine Spam-E-Mails da rein dragdroppen, dort werden sie dann audio-visuell geschreddert und am Ende rülpst die App.
jetzt muss du ihm nur noch erklären "wie" man das macht denn das ist das was die User gerne wissen wollen
Das C# Active-X Object im Xbase instanziieren und an dessen Events lauschen. Sollte für einen eingefleischten Xbase++-Programmierer ohne weitere Unterstützung machbar sein. Ich zeig lieber nicht, wie ich es machen würde. Wäre wieder mal zu kompliziert. Aber so schön mit den ganzen Connection Point-Interfaces. Und man wäre nicht auf IDispatch als Outgoing Interface genagelt. Connectable Objects: Echte Gourmetstücke.
es gibt dazu einen Thread von mir im Forum wie eine DotNet COM erstellt die man unter Xbase++ einbinden kann.
Perfekt. Warum hast dann nicht den Active-X-Vorschlag gemacht?

Und um die ganze Geschichte zu erzählen: Ich bin extra wegen Dir auf den Dachboden und habe mir da den Kraig Brockschmidt: Inside Ole, Second Edition aus dem Archiv rausgezogen, um mein Testprogrämmchen zu zimmern. Fast das ganze Wochenende habe ich dann mit ihm verbracht, mich ins OLE-Thema eingelesen und experimentiert. Das letzte Mal war vor 10 Jahren! Schöne Sachen könnte man da machen. Aber es wird enden wie immer und ich habe mir für dieses Jahr eigentlich ein paar andere Dinge vorgenommen, als Kraigs Beispiele alle im Xbase++ umzusetzen, so wie ich es 2003 mit denen von Charles Petzold gemacht habe. Die Welt hat es nicht geändert.

Viele Grüße
Michael

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Do, 18. Jan 2018 0:05

mikehoffmann hat geschrieben:
Mi, 17. Jan 2018 18:56
Ich bin extra wegen Dir auf den Dachboden
Danke, aber das wäre nicht Notwendig gewesen.
mikehoffmann hat geschrieben:Warum hast dann nicht den Active-X-Vorschlag gemacht?
das ist eben was ich meine : HaPe und du gehen gleich auf die (richtige) "grosse" Lösung.

je nachdem was Benz vor hat wäre es mit die schwierigste Lösung ... sicherlich eleganter als mit FindWindow() / SendMessageA().
wenn Benz jedoch nur eine (kleinen) String in ein EDIT (SLE) Feld bringen will reicht auch IMHO eine "kleine" Lösung.

---

nun haben wir im Forum ja viele User mit Unterschiedlichen Level : von Cl*pper bis zu C# Programmieren.
obwohl wir inzwischen alle mit Windows arbeiten, was für Xbase++ notwendig ist, ist Windows "self" für viele Unbekannt.

Möglichkeiten Windows API Functionen zu nutzten hat Xbase++ "im Prinzip" aber Beispiele findet man nur in Newsgroups oder Foren wie diesem. wenn ich dann hier im Forum antworte versuche ich den Level auf den "kleinsten" zu halten damit man zumindest eine Vorstellung bekommt von "was" geredet wird.

bei Pablo in der Newsgroup sieht es ganz anders aus mit dem Level.
Es würde kaum Sinn machen in diesem Forum nach iUnknown Interface Syntax Fragen zu stellen.

eine Antwort von Pablo an mich sieht dann so aus :D
IPotatoInterface potato is a structucture so cqannot provide as a parameter, instead we using a pointer to this structure
IPotatoInterface* pPotato is the interface pointer we will use but lets rename with a more friendly name

Code: Alles auswählen

#typedef  IPotatoInterface*   LP_IPotatoInterface
so we declaring

Code: Alles auswählen

LP_IPotatoInterface  pPotato that is equivalent
pPotato is a pointer that will be provided by the calling function so the function will be

Code: Alles auswählen

HRESULT  GiveMeTheIPotatoInterfacePointer(  LP_IPotatoInterface   *  ppPotatoInterface )
so as we want to pass a 32bitnumber by reference we will call in xbase like

Code: Alles auswählen

local pPotatoInterface := 0 //  is a 32 bit pointer but for us is just a int32 number 
result := PfQCall( fp , "__sl_@sl" ,@pPotatoInterface ) 
as this

Code: Alles auswählen

HRESULT  GiveMeTheIPotatoInterfacePointer(  LP_IPotatoInterface   *  ppPotatoInterface )
is exactly the same as

Code: Alles auswählen

HRESULT  GiveMeTheIPotatoInterfacePointer(  IPotatoInterface  * *  ppPotatoInterface )
we calling in the same way
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » Do, 18. Jan 2018 12:31

Es würde kaum Sinn machen in diesem Forum nach iUnknown Interface Syntax Fragen zu stellen.
Ich würde sagen, dass diese Frage unabhängig vom Ort, wo sie gestellt wird, etwa so viel Sinn macht, wie die Frage nach der Farbe von IUnknown, das übrigens ein verbrieftes Recht hat, mit großem I geschrieben zu werden.

Eben hat der Postbote mir "Windows Internals, 7th Edition" gebracht. Jetzt weiß ich gar nicht mehr, wo ich mit Lesen anfangen soll.

Dir empfehle ich nochmal den Kraig Brockschmidt, der müsste sogar auf den guten alten MSDN CDs zu finden sein. Dann verstehst Du auch den ganzen Kram, den man für Dein Device-Enumeration Problem braucht. Googlewissen ist Mist, glaub mir's. Willst Du Zauberlehrling oder Zauberer sein?

Michael

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Fr, 19. Jan 2018 23:02

mikehoffmann hat geschrieben:
Do, 18. Jan 2018 12:31
Willst Du Zauberlehrling oder Zauberer sein?
kein Zauberer sondern eher Handwerker ;-)

---

XbPart sind ja Stand Windows NT also "einfacher" C Kram wo man massenweise Beispiele bei MSDN findet.
auch mein Wissensstand in Sachen C ist Petzold Band 5 worauf mein native Controls beruhen.

ein Teil meiner native Controls, wie Listview, gibt es gar nicht als XbPart.
andere DXE Control dienen als Ersatz für ActiveX wie XbpStatusbar(), XbpDatepicker(), XbpMounthPick() oder XbpToolbar()
zu DXE_Toolbar() gibt es auch DXE_Rebar()
das DXE_Progressbar() Control hat auch ein "funktionierendes" ITaskbarList3 Interface.

Die DXE Lib ist ja als "Open Source" gedacht.
Es ist mir aber bislang nicht gelungen mehr "Mitstreiter" zu finden um die DXE Lib zu erweitern.

---

lieber Mike.
lass und doch bitte nicht so ins Detail gehen wo Benz doch nach einer "Lösung" sucht.
ich fürchte TEXT wird im dabei weniger helfen als CODE den er sofort "testen" könnte um einen Schritt weiter zu kommen.

p.s. bei MSDN steht zwar auch viel "Mist" aber es ist immer noch (für mich) "die" Quelle
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » So, 21. Jan 2018 12:26

ein "funktionierendes" ITaskBar3 interface ist ja nicht schlecht, aber ein funktionierendes hat auch etwas für sich. Man kann es nämlich benutzen, um z.B. einen ProgressBar auf dem TaskBar-Button seiner Applikation pümpeln zu lassen. Wunderschön...

Und das geht dann so:

Code: Alles auswählen

* Cockpit Library
* TaskbarPump sample
* (c) 2003-2018 Michael Hoffmann, all rights reserved

SECTION #defines and #includes

   #include "CockpitGuiLibs.ch"
   #include "CockpitShellLibs.ch"
   #include "CrackAndDispatch.ch"
   #include "Windows.ch"
   #include "ShellApi.ch"
   #include "shlguid.ch"
   #include "wtypes.ch"
   #include "shobjidl.ch"
   #include "winerror.ch"

   #define ID_TIMER 1

ENDSECTION


SECTION Main Function

   FUNCTION Main

      * Initialize COM
      CoInitialize()

      * Tell the UserTask which window to instantiate
      UserTask(TaskbarPumpWindow())

      * Run the application
      Application():Run()

      * Deactivate COM
      CoUninitialize()

   RETURN NIL

ENDSECTION


SECTION The TaskBarPumpWindow Class

   ***********************************************************************************
   *                       Your UserTaskWindow class goes here                       *
   ***********************************************************************************

   CLASS TaskbarPumpWindow FROM CrackAndDispatch,UserTaskWindow

    EXPORTED:

      VAR taskBar
      VAR pumpPos
      VAR increment
      VAR maxVal

      * Standard messages
      METHOD OnShowWindow

      METHOD StartPumping
      METHOD StopPumping
      METHOD MovePump

      INLINE DISPATCHMAP
          MAP TIMER 1 TO ::MovePump()
      ENDDISPATCHMAP

   ENDCLASS

   METHOD TaskbarPumpWindow:OnShowWindow(shown)

      * Are we being shown?
      IF shown
         ::StartPumping()
        ELSE
         ::StopPumping()
      ENDIF

   RETURN NIL

   SECTION Pumping methods

      METHOD TaskbarPumpWindow:StartPumping

         * Get a connection to the task bar
         LOCAL rc := CoCreateInstance(CLSID_TaskbarList,NIL,CLSCTX_ALL,ITaskbarList3(),@::taskBar)

         * That went wrong?
         IF .NOT. SUCCEEDED( rc )
            SysError("Busted. No access to task bar.")
         ENDIF

         * Activate progress bar mode
         ::taskBar:SetProgressState(self,TBPF_NORMAL)

         * pump mathematics
         ::pumpPos := 0
         ::increment := 1
         ::maxVal := 100

         * Start the timer (one call every 50 millisecs)
         ::SetTimer(ID_TIMER,50)

      RETURN NIL

      METHOD TaskbarPumpWindow:StopPumping

         * Switch off the progress bar mode
         ::taskBar:SetProgressState(self,TBPF_NOPROGRESS)

         * release the task bar
         IF ::taskBar # NIL
            ::taskBar:Release()
         ENDIF

         * No more timer calls, please
         ::KillTimer(ID_TIMER)

      RETURN NIL

      METHOD TaskbarPumpWindow:MovePump

         * Pick the punping direction
         IF ::pumpPos >= ::maxVal
            ::increment := -1
           ELSE
            IF ::pumpPos <= 0
               ::increment := 1
            ENDIF
         ENDIF

         * change the pump position
         ::pumpPos += ::increment

         * Telle the progress bar what happened
         ::taskBar:SetProgressValue(self,::pumpPos,::maxVal)

      RETURN NIL

   ENDSECTION

ENDSECTION


SECTION Knockouts

   * Suppress XPBCRT Window
   FUNCTION AppSys
   RETURN NIL

   FUNCTION DbeSys
   RETURN NIL

ENDSECTION


Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11560
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: 2 Applikationen, springen von einer in die andere

Beitrag von AUGE_OHR » Mo, 27. Aug 2018 13:06

mikehoffmann hat geschrieben:
So, 14. Jan 2018 14:15
Wenn Du das verstanden und Dich durch die Clipboard-Formate der Office-Programme gekämpft und gegoogelt und geweint hast, dann kannst Du zu Werke gehen und Dein COM-Objekt schreiben, das ein IDropTarget Interface implementiert. Dieses muss sich dann noch mit RegisterDragDrop beim Betriebssystem registrieren.
hab das Buch mal wieder in der Hand gehabt und dann wurde mir auf einmal klar wie ich ein Attachment "aus" Outlook per DragDrop bekommen kann :idea:
Outlook_DDE.jpg
Outlook_DDE.jpg (337.75 KiB) 749 mal betrachtet
das ist zwar wohl "nur" DDE aber es scheint zu funktionieren ... wenn "alle Infos" zum "identifizieren" vorhanden sind.
es sind zwar bislang noch keine Attachments dabei aber die HTML Mail "versteht" er schon :D
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: Mo, 21. Sep 2015 16:22

Re: 2 Applikationen, springen von einer in die andere

Beitrag von mikehoffmann » Di, 28. Aug 2018 12:01

Hallo Jimmy,
falsches Buch, wenn Du den Petzold meinst. Schau mal lieber in den OLE-Schinken. Da findste alles Nötige.
Heute macht niemand mehr DDE und das würde damit auch nicht gehen.
Viele Grüße
Michael

Antworten