Autor Beitrag
snoopyonline
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 09.12.08 17:37 
Ich habe einen kleinen "Startmanager" geschrieben, der es ermöglichen soll, sich beim Öffnen einer
Datei aus dem Explorer auszusuchen mit welchem Programm diese geöffnet werden soll (da unterschiedliche
Programmversionen der entsprechenden Bearbeitungssoftware benutzt werden).

Ich verknüpfe also die entsprechende Erweiterung mit meinem Programm und löse dann mit

ausblenden Delphi-Quelltext
1:
shellExecute(0,'open', Pchar('Zielprogramm.exe'),pchar(Dateiname),nil,SW_SHOWNORMAL)					


den Start des Bearbeitungsprogramms aus. Soweit alles bestens.

Wenn ich jetzt eine weitere Datei im Explorer starte, wird bei diesem Vorgehen eine weitere Instanz
des Bearbeitungsprogramms geöffnet.

Wie kann ich es anstellen, dass die Datei stattdessen im bereits gestarteten Programmfenster des Bearbeitungsbrogramms
geöffnet wird.

Trotz intensiver Suche im Forum habe ich nur Lösungen gefunden, wie man mehrere Instanzen des eigenen Programms verhindert bzw. maximal ein WM_CLOSE ans Zielprogramm schicken kann. Das hilft mir aber leider nicht weiter.

Also Dank im Voraus für eure Unterstützung...

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt
SAiBOT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 323
Erhaltene Danke: 6

XP SP2; 7
D7; D2009
BeitragVerfasst: Di 09.12.08 18:59 
Eine Idee wäre:
Beim starten des Prozesses prüfen ob eine andere Instanz läuft, falls ja mittels Suche in: Delphi-Forum IPC mit dem laufendem Prozess kommunizieren und Prozess beenden!

_________________
Debuggers don't remove bugs, they only show them in slow-motion.
snoopyonline Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 09.12.08 20:13 
@Tobias: Danke für die schnelle Antwort.

Ich muss mal schauen was IPC ist und was es kann - vielleicht kann man damit ja das Öffnen einer Datei "fernsteuern".
Fest steht aber, dass es keine Alternative darstellt, das Bearbeitungsprogramm/Zielprogramm zu schließen. In diesem sind meist ja bereits andere Dateien offen und werden auch gerade bearbeitet.

Es muss also unbedingt die "neue" Datei zusätzlich geöffnet werden.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 09.12.08 20:35 
Nein, Ipc geht auch nur mit einem eigenem Prozess...
snoopyonline Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 09.12.08 20:48 
Hab mal die Suchergebnisse zu IPC durchgeschaut und muss zugeben, dass ich daraus nicht so richtig schlau werde... Vor allem weiß ich nicht, was ich dem Zielprogramm eigentlich "senden" müsste, um dort ne Datei zu öffnen.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 09.12.08 21:37 
IPC hilft dir bei dem Problem auch nicht, denn wenn ich es richtig verstanden habe, hast du das Zielprogramm nicht selbst Programmiert...

Vielleicht könnte man da einen Shellhook installieren, um zumindest schonmal den Start abzufangen, siehe hier...
snoopyonline Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Di 09.12.08 22:29 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
IPC hilft dir bei dem Problem auch nicht, denn wenn ich es richtig verstanden habe, hast du das Zielprogramm nicht selbst Programmiert...


Korrekt! Das Zielprogramm ist ein CAD-programm - kann man also durchaus als komplex bezeichnen ;-) - und ich versuche irgendwie die entsprechenden Zeichnungen in dieses
hineinzuöffnen.

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:

Vielleicht könnte man da einen Shellhook installieren, um zumindest schonmal den Start abzufangen, siehe hier...


Hab mir die Datei mal runtergeladen und auch das Demo ausprobiert. Da Notepad als "Testanwendung" immer gleich startet und auch immer die selben Abfragen kommen - egal ob der Hook gestartet ist oder nicht, erschließt sich mir die Funktion dieses Programms leider nicht. Ich habe nicht das Gefühl, dass dort irgendwas abgefangen wird.

Und selbst wenn ich den Start einer neuen Instans meines Zielprogramms (AutoCAD) verhindere, bekomme ich ja noch lange nicht meine Datei in die laufende Instanz.
(Sorry, falls ich dich da irgendwie missverstanden haben sollte.)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 10.12.08 10:25 
Überlegen wir doch mal was da passiert und wie es funktioniert:
Du klickst eine CAD-Datei doppelt im Explorer an. Windows ermittelt das zugehörige Programm und übergibt ihm die Datei als Parameter. Du klickst noch eine CAD-Datei doppelt an. Windows ermittelt das zugehörige Programm und übergibt ihm die Datei als Parameter. Windows kann nicht anders als eine neue Instanz starten. Soll keine zweite Instanz des Programmes laufen, muss ich das Programm selber darum kümmern, indem es guckt, ob es schon läuft und wenn ja muss die zweite Instanz die Parameter an die erste übergeben (per IPC) und sich dann selber beenden. Ist dieses Verhalten nicht implementiert, wirst du nichts machen können. An ein gestartetes Programm kann man keine weiteren Parameter übergeben.
SAiBOT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 323
Erhaltene Danke: 6

XP SP2; 7
D7; D2009
BeitragVerfasst: Mi 10.12.08 13:25 
user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
Nein, Ipc geht auch nur mit einem eigenem Prozess...


Ja, habs' falsch verstanden!

Allerdings ist IPC in einem fremden prozess alles andere als unmöglich!

Komplizierter wird es dann nur mit dem öffnen der Datei im fremden Prozess!

_________________
Debuggers don't remove bugs, they only show them in slow-motion.
snoopyonline Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 10.12.08 14:11 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Überlegen wir doch mal was da passiert und wie es funktioniert:
Soll keine zweite Instanz des Programmes laufen, muss ich das Programm selber darum kümmern, indem es guckt, .... Ist dieses Verhalten nicht implementiert, wirst du nichts machen können


Diese Funktionalität ist im Zielprogramm (AutoCAD) aber implementiert. Der Normalzustand beim Öffnen der Zeichnungsdatei im Explorer ist, dass alle weiteren Zeichnungsdateien immer in der bereits laufenden Instanz
geöffnet werden.

Das Problem der mehreren Instanzen tritt ja nur dadurch auf, dass ich mit meinem Programm die Zeichnungsdatei per shellexecute direkt an die Startdatei des Zielprogramms übergebe und die Windows-Verknüpfung nicht nutze (Ich öffne ja nicht die Zeichnungsdatei sondern öffne das Programm und übergebe die Datei als Parameter).

Der Grund warum ich die Windows-Verknüpfung nicht nutze bzw. nutzen will ist folgender:

Wie bereits geschildert arbeite ich mit 2 Programmversionen von AutoCAD. Beide Versionen ändern beim Programmstart die Windows-Verknüpfungen automatisch. Dadurch wird die Zeichnungsdatei automatisch mit der zuletzt benutzten Version geöffnet.
Das ist leider extrem unpraktisch und der Anlass für meinen Versuch mit meinem "Starter" eine gezielte Steuerung zu ermöglichen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 10.12.08 15:07 
user profile iconsnoopyonline hat folgendes geschrieben Zum zitierten Posting springen:
Diese Funktionalität ist im Zielprogramm (AutoCAD) aber implementiert. Der Normalzustand beim Öffnen der Zeichnungsdatei im Explorer ist, dass alle weiteren Zeichnungsdateien immer in der bereits laufenden Instanz
geöffnet werden.
:roll: Wenn das so ist, warum schaust du dann nicht einfach nach was dabei passiert?
Im Windows Explorer unter Extras --> Ordneroptionen... --> Dateitypen. Dort kannst du einfach nachschauen was bei der Aktion passiert.
snoopyonline Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 10.12.08 21:01 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Im Windows Explorer unter Extras --> Ordneroptionen... --> Dateitypen. Dort kannst du einfach nachschauen was bei der Aktion passiert.


Wie oben beschrieben weiß ich ja bereits was dort passiert - die Dateierweiterung ist mit "AutoCAD Application" verknüpft. Unter den erweiterten Einstellungen findet sich dann genau das was ich anwende "c:\Programme\usw..\Acad.exe" "%1".

Leider weiß ich nicht was es mit "DDE verwenden" auf sich hat und ob der DDE-Eintrag [open("%1")] mich hier irgendwie weiterbringt.

Und ansonsten gilt: Diese Verknüpfung wird anscheinend jedes mal durch AutoCAD neu gesetzt - je nach dem welche Version (2005 bzw. 2009) halt zuletzt gestartet war.

Und diese Verknüpfung (in der Registry) durch mein Programm auch noch mal zu ändern, ist mir zu riskant.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 10.12.08 21:22 
user profile iconsnoopyonline hat folgendes geschrieben Zum zitierten Posting springen:
Leider weiß ich nicht was es mit "DDE verwenden" auf sich hat und ob der DDE-Eintrag [open("%1")] mich hier irgendwie weiterbringt.
Ja, genau das ist es ja was passiert, wenn die Anwendung bereits geöffnet ist. Ein Beispiel findest du hier:
www.delphipraxis.net...st683534.html#683534

user profile iconsnoopyonline hat folgendes geschrieben Zum zitierten Posting springen:
Und diese Verknüpfung (in der Registry) durch mein Programm auch noch mal zu ändern, ist mir zu riskant.
Was ist daran riskant? :gruebel:
Aber der bessere Weg ist es natürlich das Öffnen selbst zu machen. Das sollte wie in dem verlinkten Code funktionieren.
snoopyonline Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Fr 12.12.08 23:10 
Das mit dem DDE war eigentlich ein super Tipp! Ich habe es sogar hinbekommen, mit meinem Programm Befehle an AutoCAD zu senden. Leider gibt es in AutoCAD aber keinen "Öffnen"-Befehl welcher ohne das Öffnen-Dialogfenster auskommt.

Also anders gesagt: ich komme hier irgendwie nicht weiter... Trotzdem vielen Dank für alle bisherigen Tipps
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 13.12.08 12:46 
Naja, dann benutze doch das Dialogfenster und steuere das halt wie gewünscht, z.B. mit sendkey...