Vent på program og fortsæt (i en Service)
HejsaJeg er stødt ind i et problem, som jeg tror bunder i forskellen på et alm. program og en windows service.
Jeg havde et serverprogram (en almindelig .exe fil) som står og snurrer. Dette program indeholder en indy tcpserver som står og lytter på en bestemt port. Når den modtager en kommando, udfører den denne kommando (et program og nogle parametre, der danner en fil på serveren) og sender denne fil tilbage til klienten som sendte kommandoen.
Uddrag af koden: (tcp serverens onexecute)
-------------------
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
wnd := Application.Handle;
lpFile := PChar(App); //programstrengen
lpParameters := PChar(Parameters); //parameterstrengen
nShow := SW_SHOWNORMAL;
end;
//udfør app + parametre og vent...
if ShellExecuteEx(@SEInfo) then
begin
WaitForSingleObject(SEInfo.hProcess, INFINITE);
CloseHandle(SEInfo.hProcess);
end;
//send (stream) filen til klienten via tcp
try
Stream:=TFileStream.Create(FileName,fmOpenRead);
try
AContext.Connection.IOHandler.Write(Stream,0,true);
finally
Stream.Free;
end;
except
on E: Exception do
begin
ShowMessage('Overførselsfejl: '+E.Message);
end;
end;
-------------------
Dette virker helt perfekt! Klientprogrammet som sender kommandoen+parametrene, kan læse streamen og modtage den fil serverprogrammet dannede over.
Nu vil jeg så gerne lave programmet om til en service.
Har læst meget omkring disse services og trådning i dem osv. og alt virker sådan set på nær en afgørende ting! Min kode venter ikke længere på at den får udført programmet, hvilket resulterer i at den går videre og prøver at skrive en fil på streamen, selvom filen endnu ikke eksisterer og så fejler den selvfølgelig.
Skal lige siges at der hvor jeg sætter handle i det oprindelig program (wnd := Application.Handle;), kan jeg ikke længere sætte den til Application.handle, da jeg ikke længere har "Application" til rådighed nu jeg laver det som service. Derfor bliver handle sat til 0 istedet (wnd := 0). Ved ikke om dette har nogen indflydelse. Har prøvet at debugge med GetLastError() og der får jeg netop noget med "Invalid handle".
Jeg har virkelig brug for hjælp - har læst og læst rundt på nettet og lige lidt hjælper det. Kan finde masser af artikler der beskriver at starte et program, vente og kører videre - men kan ikke finde noget når det samme skal foregå inde i en service.
Alle inputs er velkomne - jeg skal bare videre :)