[Delphi] Applicatie herstarten

Pagina: 1
Acties:

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Ik ben bezig aan een applicatie dat als server dient voor een intern netwerk met PDA's. Ik maak kleine internetpagina's die via WiFi op te vragen zijn (of via elk ander netwerk natuurlijk). Ik maak gebruik van IntraWeb, het is alleen een beetje jammer dat ik het poortnummer van het component niet runtime kan wijzigen. Nu ben ik op zoek naar een stukje code dat mijn applicatie opnieuw kan starten. Ik heb twee mogelijkheden gehad maar die werken beide niet.

De eerste is deze:
Delphi:
1
2
3
4
5
6
7
var
  tmpAppName: PChar;
begin
  tmpAppName := PChar(Application.ExeName);
  Close;
  ShellExecute(0, 'open', tmpAppName, nil, nil, SW_SHOWNORMAL);
end;

Deze werkt niet omdat het formulier waarop de actie wordt uitgevoerd niet de MainForm van de applicatie is. Ik heb namelijk in de project-bron nog wat code staan om voor parameters etc die de automatische detectie van het mainform verprutsen.

De tweede:
Delphi:
1
2
3
4
5
6
7
var
  tmpAppName: PChar;
begin
  tmpAppName := PChar(Application.ExeName);
  ShellExecute(0, 'open', tmpAppName, nil, nil, SW_SHOWNORMAL);
  Application.Terminate;
end;

Werkt niet omdat er in de project-code ook code zit die controleert of de applicatie niet toevallig twee keer wordt opgestart. Dus op het moment dat de nieuwe gestart wordt is de oude nog actief. De nieuwe wordt wel gestart maar blijft na de geboorte in coma (er gebeurt niets meer mee) en de eerste wordt gesloten.

Dit is de code waarmee ik een tweede instantie voorkom:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  appMutex := CreateMutex(nil, True, PChar(Application.Name));
  if appMutex <> 0 then
  begin
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageBox(Application.Handle,
        PChar('Er is al een server actief. ' + #10 +
              'U kunt deze herkennen aan het kleine satalieticoontje in de taakbalk. '),
        PChar('Server'), MB_OK  or MB_ICONSTOP);
      CloseHandle(appMutex);
      Halt;
    end;

  end; //if appMutex


Ik ben op zoek naar een mogelijkheid om het herstarten voor elkaar te krijgen. Google en de nieuwsgroepen van borland bieden ook niet echt een oplossing, behalve diegene waar het weer misgaat me de CreateMutex.

[ Voor 3% gewijzigd door FendtVario op 28-01-2004 16:12 . Reden: kleine code wijziging ]

www.fendt.com | Nikon D7100 | PS5


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Het enige probleem dat je hebt is volgens mij het poortnummer voor de Intraweb componenten. Is het een optie om daar de oplossing te zoeken: free het intraweb component en create vervolgens een nieuwe met de juiste instellingen? Of is dat te makkelijk ;)

Andere mogelijkheid: maak een (formless) appje (app2) dat aangeroepen kan worden vanuit je app1. Geef als parameter de exe van app1 mee. Sluit dan app1 en open via app2 na een timer van bijvoorbeeld 2 seconden app1 weer. Zo kun je deze restart-tool voor alle mogelijke softwarepakketten gebruiken ;)

Eventuele optie is om te controleren op de handle van app1, en deze pas opnieuw te starten als deze helemaal verdwenen is.

My personal website


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Het intraweb component is inderdaad het probleem. Maar deze kun je niet aanroepen via een variabele zoals je met een formulier doet en er zijn geen class methods aanwezig om iets te wijzigen in het component. Als iemand een oplossing weet om de ServerController van IntraWeb runtime te benaderen is dat natuurlijk ook goed.

Tweede is een optie waar ik ook dacht, maar ik heb het idee dat het netter moet kunnen.

De laatste optie is geen optie want dat zou betekenen dat alle nieuwe instanties die gestart worden blijven wachten totdat de eerste is afgesloten.

www.fendt.com | Nikon D7100 | PS5


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

De mutex sluiten voordat je de nieuwe opent lijkt me een simpele en doeltreffende oplossing :)

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


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Euh ja, dat kan natuurlijk ook. En warempel, het werkt. 8)7

www.fendt.com | Nikon D7100 | PS5