Avatar billede hmann Nybegynder
09. september 2009 - 11:38 Der er 1 løsning

Vent på program og fortsæt (i en Service)

Hejsa

Jeg 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 :)
Avatar billede hmann Nybegynder
23. juni 2010 - 12:46 #1
lukket
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester