[delphi] Programma starten/stoppen werkt buggy.

Pagina: 1
Acties:

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Ik heb een systray programmatje gemaakt. Als ik daar op een button in een popupmenu klik, moet apache.exe gestart worden.
Dat gaat allemaal netjes. Ik krijg apache.exe in een DOS-console te zien.
Als je dan nog een keer op die zelfde knop klikt, moet die console zich sluiten. En dat gaat nu buggy. Als ik er namelijk op klik, werkt het niet. Maar als ik éérst de console (voor de eerste keer) even aanklik, werkt het wel!
Kortom, het console venster moet eerst actief worden, en dan pas kan ik 'm sluiten.

Ik gebruik de volgende code voor het starten van apache.exe:
Delphi:
1
ShellExecute(Application.Handle, NIL, pchar(Set_Apache_url+'\apache.exe'), nil, nil, SW_SHOWNORMAL);

De set_apache_url waarde bevat het pad (de mappen) naar apache.exe zonder \.
Dit is de code die ik gebruik om het venster te sluiten:
Delphi:
1
PostMessage(FindWindow(nil, pchar(set_apache_url + '\apache.exe')), WM_CLOSE, 0, 0);


Kan iemand mij uitleggen waarom dit zo buggy werkt. Bij een vorig programma dat ik gemaakt heb, werkt het wel.
Dus, waarom werkt het niet en hoe zou ik dat eventueel kunnen oplossen?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 15:07

Tomatoman

Fulltime prutser

Da's inderdaad raar. Maar dan activeer je het DOS-venster toch eerst met een WM_ACTIVATE message? Niet fraai, maar het werkt vast wel.

Een goede grap mag vrienden kosten.


  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Hmz, dat is dan ook weer gek, dat werkt niet. Als ik handmatig met de muis het console venster eerst aanklik of minimalizeer/maximalizeer werkt het wel...

  • killermar
  • Registratie: Augustus 2002
  • Laatst online: 12-07 08:05
Mischien kan je ook als eerste parameter aan ShellExecute niet je app handle meegeven maar gewoon een nil.

  • Eegee
  • Registratie: Januari 2000
  • Laatst online: 25-08 19:22
En als je het met CreateProcess probeert ipv ShellExecute?

http://www.swissdelphicenter.ch/en/showcode.php?id=93
http://www.swissdelphicenter.ch/en/showcode.php?id=455

[ Voor 0% gewijzigd door Eegee op 05-11-2002 23:20 . Reden: Links toegevoegd ]


  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
killermar schreef op 05 november 2002 @ 23:15:
Mischien kan je ook als eerste parameter aan ShellExecute niet je app handle meegeven maar gewoon een nil.
Hah, werkt niet met nil, je kunt wel 0 invullen, maar dat heeft geen verschil...

En over die andere manier van het programma starten, die vind ik wat te uitgebreid. Het heeft namelijk eerst wel gewerkt, en ik neem aan dat er een logische verklaring voor is... Maar toch bedankt ;)

Verwijderd

en toch zou ik CreateProcess gebruiken; zoveel ingewikkelder is het niet, en het is een veeeeeel nettere oplossing.. dan kan je bij het sluiten gewoon TerminateProcess gebruiken met hProcess uit de TProcessInformation record die je terugkrijgt...
als je het op jouw manier doet dan moet je nog maar hopen dat het werkt, aangezien het best eens zou kunnen zijn dat een andere versie van windows de windowtitle van z'n consolewindow anders noemt.. bijvoorbeeld 'apache.exe' in plaats van Set_Apache_url+'\apache.exe'... die process handle verandert niet, daar kan je vanuit gaan

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Alleen is TerminateProcess niet gewenst in de meeste gevallen. Het killed het process en geeft de applicatie geen kans netjes af te sluiten. Configuratie weg te schrijven, bestanden te flushen, sockets afsluiten, geheugen vrijmaken, enz...

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

nee maar in dit geval kan je niet anders... apache zal die WM_CLOSE message ook niet afhandelen die in z'n huidige code stuurt.. apache wordt lijkt mij ook meteen z'n nek omgedraaid

Verwijderd

ik weet trouwens niet of je ook een apachectl script onder windows hebt, of dat je apache.exe op een gebruiksvriendelijke manier van buiten kan afsluiten ofzo, bijvoorbeeld met een bepaalde commandline parameter erbij? dat zou nog mooier zijn, EN makkelijker :)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja, in dit geval wordt het console venster verzocht te sluiten en wordt apache daardoor ook gewoon gekilled. Maar iig sluit het console venster normaal :p

Is er geen versie van apache die zich gewoon houd aan wat normaal is onder windows?! Een service of een normaal win32 programma minstens? Beetje onproffesioneel zo als je het mij vraagt.

We adore chaos because we like to restore order - M.C. Escher


  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
LordLarry schreef op 06 november 2002 @ 10:18:
Is er geen versie van apache die zich gewoon houd aan wat normaal is onder windows?! Een service of een normaal win32 programma minstens? Beetje onproffesioneel zo als je het mij vraagt.
Je kunt apache ook draaien als een windows service. Ik heb dit alleen niet gedaan, omdat ik niet elke dag apache nodig heb, en voor een laptop is constant apache weer iets meer accuvretend.

Van die commands zou idd veel fijner zijn... Maar hoe zou ik dat dan in algemeen moeten doen? Ik ben nogal nieuw op delphi gebied, en vat dus nog niet wat er allemaal mogelijk is...

  • bgever
  • Registratie: April 2002
  • Laatst online: 28-05-2021
Verwijderd schreef op 06 november 2002 @ 10:13:
ik weet trouwens niet of je ook een apachectl script onder windows hebt, of dat je apache.exe op een gebruiksvriendelijke manier van buiten kan afsluiten ofzo, bijvoorbeeld met een bepaalde commandline parameter erbij? dat zou nog mooier zijn, EN makkelijker :)
Yep, na even apache.exe nader bekeken te hebben gaat dat idd. Met de "-k stop" command.
Natuurlijk heb ik het meteen in me programma gezet, en werkt als een tein. Snel, veilig en goed.
Ik gebruik nu dus de volgende code:
Delphi:
1
2
ShellExecute(0, NIL,pchar('apache.exe'), '-k stop',
pchar(Set_Apache_url), SW_SHOWNORMAL);

Probleem is dus goed opgelost, bedankt voor die tip van die comands McMotion _/-\o_
Pagina: 1