Avatar billede tknudsen Nybegynder
23. maj 2002 - 17:56 Der er 7 kommentarer og
1 løsning

starte applikation fra service

Hvordan starter jeg en applikation (feks notepad) fra en service (med CreateProcess) ?

Jeg har forsøgt, men det går ikke lige som det skal.

De applikationer jeg starter optræder kun som processor i task manageren og kommer aldrig "helt frem". Desuden kan jeg ikke afslutte disse processor !?

Jeg har forsøgt med følgende kode:

begin
    FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
    with StartupInfo do
    begin
      cb := SizeOf(TStartupInfo);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
      wShowWindow := sw_show;
    end;

    if (CreateProcess(nil,PChar(self.path),nil,nil,false,DETACHED_PROCESS,nil,nil,StartupInfo,ProcessInfo)) and
      (self.waitForProcess) then
    begin
      repeat
        while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
        begin
          if Msg.Message = wm_Quit then Halt(Msg.WParam);
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end;
        GetExitCodeProcess(ProcessInfo.hProcess ,lpExitCode);
      until lpExitCode<>Still_Active;

      with ProcessInfo do
      begin
        CloseHandle(hThread);
        CloseHandle(hProcess);
      end;
    end;
end;
Avatar billede tknudsen Nybegynder
23. maj 2002 - 17:57 #1
koden er fra en metode i en klasse - derfor self.path og self.waitForProcess
Avatar billede badass Nybegynder
24. maj 2002 - 09:47 #2
Prøv denne funktion

Function WinExecAndWait32(FileName:String;Visibility:integer):Integer;
var
  zAppName:array[0..512] of char;
  zCurDir:array[0..255] of char;
  WorkDir:String;
  StartupInfo:TStartupInfo;
  ProcessInfo:TProcessInformation;
begin
  StrPCopy(zAppName,FileName);
  GetDir(0,WorkDir);
  StrPCopy(zCurDir,WorkDir);
  FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  StartupInfo.cb:=Sizeof(StartupInfo);

  StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow:=Visibility;
  if not CreateProcess(nil,
                      zAppName, { pointer to command line string }
                      nil,      { pointer to process security attributes }
                      nil,      { pointer to thread security attributes }
                      false,    { handle inheritance flag }
                      CREATE_NEW_CONSOLE or { creation flags }
                      NORMAL_PRIORITY_CLASS,
                      nil,      { pointer to new environment block }
                      nil,      { pointer to current directory name }
                      StartupInfo,          { pointer to STARTUPINFO }
                      ProcessInfo) then
    Result:=-1                              { pointer to PROCESS_INF }
  else
  begin
    WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess,Result);
  end;
end;

FileName  = Navnet på programmet som skal startes (eks. "sti"\notepad.exe)
Visibility = Hvordan skal programmet vises (eks. SW_SHOWNORMAL)
Avatar billede tknudsen Nybegynder
24. maj 2002 - 09:51 #3
mon ikke forskellen ligger i de creation flags du bruger ?

jeg kan først teste det iaften...
Avatar billede badass Nybegynder
24. maj 2002 - 10:04 #4
Det vil jeg tro - har selv brugt funktionen flere gange, med succes
Avatar billede tknudsen Nybegynder
24. maj 2002 - 10:06 #5
Problemet er vel at det er en service, som starter de andre programmer !?
Avatar billede badass Nybegynder
24. maj 2002 - 10:29 #6
Det kan du ha' ret i
Avatar billede tknudsen Nybegynder
26. maj 2002 - 19:20 #7
ihvertfald ændrer det ikke mit problem...

andre bud ?
Avatar billede tknudsen Nybegynder
23. januar 2005 - 11:33 #8
lukker.
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
Kategori
Kurser inden for grundlæggende programmering

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