Entwickler-Ecke

Windows API - Mehrere Anwendungen verwalten


Mortal-Shadow - Mi 11.02.09 18:15
Titel: Mehrere Anwendungen verwalten
Hi,

da ich wenn ich Wc3 spiele, auch immer das Programm Listchecker, sowie ein Autohotkey-script benutze,
wollte ich mir ein Programm schreiben, welches alle 3 automatisch aufruft.
Also ich starte mein Delphi-Programm, welches WC3, Listchecker und AH aufruft.
Das funktioniert mittels shellexecute auch (fast - siehe unten) wunderbar.

Der problematische Teil ist der, alles zu schließen Falls WC3 beendet wird.
Mein Ansatz war der: Periodisch mit FindWindow() WC3 zu suchen.
Falls es nicht mehr da ist:

Delphi-Quelltext
1:
sendmessage(handle_LC,wm_close,0,0)                    

Das finden von WC3 scheint zu klappen, nur nicht das schließen von Listchecker (ebenso wie Autohotkey)
Diese zeigen sich auch von sendmessage ebenso wie DestroyWindow() unbeeindruckt.
Ihre handles habe ich dabei gleich zu beginn bei shellexecute gespeichert (handle_LC := shellexecute(...))

Des weiteren gab es noch ein Problem beim Starten von LC.
Er will zu beginn auf die datei listchecker.ini zugreifen, sucht diese aber immer im Pfad meiner Programm-exe.
Wie umgehe ich dass (außer, dass ich sie, so wie im moment im gleichen Pfad habe).

Und noch die Frage: Ist periodisches Abfragen von Wc3 sinnvoll, oder gibt es eine Windowsnachricht, wenn ein Programm geschlossen wird, die ich abfangen könnte?

Danke im Vorraus,

MS.


JayEff - Mi 11.02.09 18:26
Titel: Re: Mehrere Anwendungen verwalten
user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Ihre handles habe ich dabei gleich zu beginn bei shellexecute gespeichert (handle_LC := shellexecute(...))
http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx
Shellexecute liefert kein Handle zurück sondern einen Fehlerwert :!:
Für handlesuche nutzt man Suche in: Delphi-Forum, Delphi-Library FINDWINDOW, am besten den Code von http://www.x-spy.net ausgeben lassen.


Narses - Mi 11.02.09 18:29

Moin!

Oder einfach gleich Suche in: Delphi-Forum, Delphi-Library SHELLEXECUTEEX nehmen. ;)

cu
Narses


Mortal-Shadow - Mi 11.02.09 22:00

Hi,

also mit FindWindow lassen sie sich jetzt schön brav schließen :-)
Kann ich aber irgendwie vortäuschen, die Programme von einem anderen Pfad aus auszuführen.
(In Hinblick auf die Listchecker.ini)

Btw: Die Suche nach shellexecuteex gibt eigentlich nur Infos über shellexecute aus.
Musst ich schon Google bemühen :P
Wobei ich damit um ehrlich zu sein auch nicht richtig zurecht kam. Hilfreiche Infos sind recht rar gesät.
Naja - JayEffs Tipp funktioniert ja.


jaenicke - Mi 11.02.09 22:15

Schau doch einmal in die Dokumentation...
http://msdn.microsoft.com/en-us/library/bb762153.aspx

Den Pfad deines Programms nimmt ShellExecute nur, wenn du als Verzeichnis nichts oder eben dieses Verzeichnis angibst.

Eine Alternative zu ShellExecute(Ex) wäre auch noch CreateProcess, das unter anderem ein Handle zu dem Prozess und dessen ProcessID zurückgibt.
http://msdn.microsoft.com/en-us/library/ms682425.aspx

// EDIT:
Ach ja, ein Beispiel, in diesem Fall werden die Infos zum Warten benutzt:
http://www.delphi-library.de/viewtopic.php?t=15943


Mortal-Shadow - Mi 11.02.09 22:56

Nein, was ich meine ist:
Meine exe liegt in C:\bla\Programmiertes-Delphi\
Nun motzt Listchecker: Could not open C:\bla\Programmiertes-Delphi\Listchecker.ini
- statt das er den Pfad seiner eigenen exe benutzt.
Ich will nun wissen, wie ich hinkriege, die zwei exe in verschiedenen Pfaden zu speichern.
(Mein Programm nicht im selben Ordner wie den Listchecker)


jaenicke - Mi 11.02.09 23:00

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Nein, was ich meine ist:
Genau das meine ich ja auch.

Listchecker ist nach deinen Worten offensichtlich nicht sauber programmiert und benutzt das aktuelle Arbeitsverzeichnis statt das Programmverzeichnis, in dem die Exe liegt. (Mal bgesehen davon, dass die INI eh nicht wirklich da hingehört, aber das nur nebenbei^^)

Und genau deshalb musst du das Arbeitsverzeichnis beim Starten des Programms eben korrekt angeben.


Mortal-Shadow - Mi 11.02.09 23:08

Ah, Fehler gefunden als ich das ganze als Konsolenanwendung machen wollte - statt mit ner Form.
Ich hatte shellexecute(handle,...) - also mein eigenes Fenster als parent-window.
Wenn ich da 0 reinschreib gehts.
€: Geht doch nicht.
Aber ich kapier nicht ganz - wie kann ich denn das Arbeitsverzeichnis angeben?
lpFile ist ja, wo die exe von LC liegt. Und wenn ich stattdessen das bei lpdirectory angebe gehts auch nicht.


jaenicke - Mi 11.02.09 23:18

Trotzdem gibst du offenbar nichts als Arbeitsverzeichnis an, sonst wäre das Handle dabei vollkommen egal... :roll:
Poste doch einfach die Zeile mal.

Außerdem ist die Frage, ob du vielleicht den Programmierer von Listchecker erreichen kannst, damit er den Fehler behebt. Denn schließlich benutzt das Programm das Arbeitsverzeichnis, was aber ja wohl falsch ist, oder?


Mortal-Shadow - Mi 11.02.09 23:20


Delphi-Quelltext
1:
shellexecute(0,nil,'C:\Meine-Programme\Spiele\Warcraft III\Listchecker\pickup.listchecker.exe',nil,nil,sw_minimize);                    


jaenicke - Mi 11.02.09 23:23

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
shellexecute(0,nil,'C:\Meine-Programme\Spiele\Warcraft III\Listchecker\pickup.listchecker.exe',nil,nil,sw_minimize);                    
Ich sagte ja, du übergibst auch gar kein Arbeitsverzeichnis...

Und wenn du nichts (nil) übergibst, dann muss Windows eben sich eins aussuchen. ;-)

Schreib da einfach das Verzeichnis hin, dann gehts auch mit Handle.


Mortal-Shadow - Mi 11.02.09 23:37

Ok, es geht mit shellexecute(0,nil,'C:\Meine-Programme\Spiele\Warcraft III\Listchecker\pickup.listchecker.exe',nil,'C:\Meine-Programme\Spiele\Warcraft III\Listchecker\',sw_minimize);

Dachte halt dass:
If a relative path is provided at lpFile, do not use a relative path for lpDirectory.
(Aus deinem Link zu Microsoft)
damit geint ist, dass directory nicht angegeben werden soll wen lpfile ungleich null ist.


jaenicke - Do 12.02.09 00:44

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Dachte halt dass:
If a relative path is provided at lpFile, do not use a relative path for lpDirectory.
(Aus deinem Link zu Microsoft)
damit geint ist, dass directory nicht angegeben werden soll wen lpfile ungleich null ist.
Auf deutsch übersetzt heißt das ja:
Wenn als lpFile ein relativer Pfad angegeben wird, benutze keinen relativen Pfad als lpDirectory.
Es geht also nicht um absolute Pfade. Und man sollte ohnehin normalerweise immer absolute Pfade benutzen.

Das heißt aber nicht, dass die Pfade fest in das Programm einprogrammiert sein müssen. Normalerweise basieren diese ja entweder auf dem Verzeichnis der eigenen Exe (ExtractFilePath(ParamStr(0))) oder auf Einstellungen. Aber wenn das Programm nur für dich ist, dann ist das egal.