Autor |
Beitrag |
Mortal-Shadow
      
Beiträge: 110
|
Verfasst: 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:
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
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 11.02.09 18:26
Mortal-Shadow hat folgendes geschrieben : | 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 FINDWINDOW, am besten den Code von www.x-spy.net ausgeben lassen.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 11.02.09 18:29
Moin!
Oder einfach gleich SHELLEXECUTEEX nehmen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Mortal-Shadow 
      
Beiträge: 110
|
Verfasst: 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
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 110
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.02.09 23:00
Mortal-Shadow hat folgendes geschrieben : | 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 
      
Beiträge: 110
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.02.09 23:18
Trotzdem gibst du offenbar nichts als Arbeitsverzeichnis an, sonst wäre das Handle dabei vollkommen egal...
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 
      
Beiträge: 110
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.02.09 23:23
|
|
Mortal-Shadow 
      
Beiträge: 110
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 12.02.09 00:44
Mortal-Shadow hat folgendes geschrieben : | 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.
|
|
|