windows - system () og CreateProcess ()/CreateProcessW ()

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil udføre en TEST.exe i et C-program. Mens jeg bruger


system( "TEST.exe <input-file> output-file" );


Jeg kan få hvad jeg forventede.


Men CreateProcessW () fungerede ikke korrekt, når jeg bruger følgende kode (se Hvordan kører jeg et eksternt program?):


if (CreateProcessW(const\_cast<LPCWSTR>(FullPathToExe.c\_str()), 
    pwszParam, 0, 0, false, 
    CREATE\_DEFAULT\_ERROR\_MODE, 0, 0, 
    &siStartupInfo, &piProcessInfo) != false) 
{ 
    /* Watch the process. */ 
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess,  (SecondsToWait * 1000)); 
    iReturnVal = GetLastError(); 
} 
else 
{ 
    /* CreateProcess failed */ 
    iReturnVal = GetLastError(); 
} 


hvor


FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file".


Og WaitForSingleObject () returnerer 258, GetLastError () returnerer 1813 ('Den angivne ressourcetype kan ikke findes i billedfilen.').


Også den ovenstående CreateProcessW () kode fungerer fint, når jeg kører mit eget HelloProcess.exe (udskrive hallo og sove nogle sekunder bestemt af det følgende nummer, og afslut derefter.) Med


FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10".


Nogle ideer? Tak for eventuelle tip!

Bedste reference


system springer faktisk en cmd forekomst, hvor din kommando køres:



  Funktionen system sender kommandoen til kommandotolken, som udfører strengen som en operativsystemkommando. system henviser til COMSPEC og PATH miljøvariabler, der finder kommandotolkfilen (filen hedder CMD.EXE i Windows NT). Hvis kommando er NULL, kontrollerer funktionen simpelthen for at se om kommandotolken findes.

  -Dokumentation af system [13]



Dette er grunden til omdirigering operatører som < og > arbejde. Dette er ikke tilfældet for CreateProcess, som virkelig udbreder en proces i stedet for en shell, der udfører en anden proces. Da omdirigeringsoperatørerne er en funktion af skallen og ikke operativsystemet, skal du gøre input og output til processen manuelt.

Andre referencer 1


Jeg gør hvad CreateProcess og kommandolinje argumenter
fortæller mig at gøre, og løse problemet! Tak jer for din opmærksomhed!


For din bekvemmelighed er her citatet af svaret:



  Du kan ikke bruge kommandolinjens omdirigeringsoperatorer med CreateProcess ()
  direkte. Du skal gyde en forekomst af cmd.exe og passere
  operatører til det i stedet, fx:


CreateProcess( "C:\windows\system32\cmd.exe", t\_str2, ...)) 

  
  Hvor
  t\_str2 er '/C C: \ Temp \ sift.exe < C: \ img1.pgm> C: \ img1.key'. Det
  egentlig sti til cmd.exe kan bestemmes ved at læse\% COMSPEC\%
  miljøvariabel.


Andre referencer 2


WaitForSingleObject () returnerer et ventesultat, og ikke exitkoden. https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx[15]


258 er en WAIT\_TIMEOUT. Du bør prøve igen på denne fejlkode, indtil du får returneringsværdien på 0 (WAIT\_OBJECT\_0) eller en anden fejl.


Brug derefter GetExitCodeProcess https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx
for at få procesens exitkode. [16]