Autor Beitrag
Mortal-Shadow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: Mi 11.02.09 18:15 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 11.02.09 18:26 
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(...))
msdn.microsoft.com/e...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 www.x-spy.net ausgeben lassen.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 11.02.09 18:29 
Moin!

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

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Mortal-Shadow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: 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
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 11.02.09 22:15 
Schau doch einmal in die Dokumentation...
msdn.microsoft.com/e...ibrary/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.
msdn.microsoft.com/e...ibrary/ms682425.aspx

// EDIT:
Ach ja, ein Beispiel, in diesem Fall werden die Infos zum Warten benutzt:
www.delphi-library.d...iewtopic.php?t=15943
Mortal-Shadow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: 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
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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: 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.


Zuletzt bearbeitet von Mortal-Shadow am Mi 11.02.09 23:19, insgesamt 1-mal bearbeitet
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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: Mi 11.02.09 23:20 
ausblenden Delphi-Quelltext
1:
shellexecute(0,nil,'C:\Meine-Programme\Spiele\Warcraft III\Listchecker\pickup.listchecker.exe',nil,nil,sw_minimize);					
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 11.02.09 23:23 
user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: 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
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: 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.