NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze: Ako spustiť externý program vo windows a odchytiť jeho návratový kód či error ak spadne na nejakú chybu?

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Developer123
Člen
Avatar
Developer123:28.3.2020 20:53

Nejde mi zachytiť návratová hodnota programu spusteného cez ShellExecuteEx. Teda možno byt to aj išlo len vôbec neviem ako na to. A či na tento účel nepoužiť radšej CreateProcessW alebo dačo také.

Zkusil jsem: Na spúštanie externých programov používam funkciu ShellExecuteEx program som spustil takto:

isExecuted = true;
SHELLEXECUTEINFO execInfo = {0};
execInfo.cbSize = sizeof(SHELLEXECUTEINFO);
execInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
execInfo.hwnd = NULL;
execInfo.lpVerb = NULL;
execInfo.lpFile = path.c_str();
execInfo.lpParameters = params.c_str();
execInfo.lpDirectory = NULL;
execInfo.nShow = SW_SHOW;
execInfo.hInstApp = NULL;
ShellExecuteEx(&execInfo);
WaitForSingleObject(execInfo.hProcess, INFINITE);
isExecuted = false;

Za nim volám WaitForSingleObject aby mi spustený program blokoval vlákno aby som vedel kedy program skončí. Samozrejme to potom budem spúšťať každý program na extra vlákne. Chcel by som zachytiť aj návratovú hodnotu programu alebo ak spadne na nejakú chybu tak aj chybu atď.Alebo ak do konzoly na záver vypíše text (napr exception) tak logovať ten text. Viete mi poradiť ako na to?

Chci docílit: Chcem si urobiť nástroj pre Windows volalo by sa to napr: manager spúšťania súborov, do ktorého si nahádžem exe súbory, tie spustím (spustenie sa bude logovať) exáč bude bežať nonstop na serveri a keď náhodou spadne tak pád sa bude logovať a podľa nastavnia sa automaticky znovu spustí (podľa možnosti aj s rôznymi parametrami ktoré si budem vedieť nastaviť).

Chcem celý proces logovať to znamená spúšťanie exáčov, ich časy, ak spadne tak exceptiony (ak to pojde) či návratový kód exáču (proste vštetko čo logovať technicky pojde).

Odpovědět
28.3.2020 20:53
YOLO
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Developer123
Martin Dráb:28.3.2020 23:19

Po WaitForSingle­Object zavolej GetExitCodePro­cess, čímž získáš návratovou hodnotu procesu. Nezapomeň také zavřít handle toho procesu skrz CloseHandle.

Co se týče logování standardního a chybového výstupu daného procesu, myslím, že budeš muset místo ShellExecuteEx použít CreateProcess a dát mu vlastní handle pro standardní výstup a standardní chybový výstup. Obvyklý postup je takový, že přes CreatePipe či CreateNamedPipe vytvoříš roury, jejichž jeden konec vždy dáš tomu novému procesu a ze druhého čteš data, která ten proces zapisuje.

Pak hodně záleží na tom, jakým způsobem chceš ta data z těchto rour číst; zda-li synchronně či asynchronně. Druhá možnost je lepší, ale budeš muset použít CreateNamedPipe a pak asynchronně používat ReadFile či ReadFileEx. Synchronní čtení se mi moc neosvědčilo (v zásadě je to čtecí vlákno zablokováno, dokud se daný proces nerozhodne něco zapsat, což mu může trvat velmi dlouho. Navíc se snadno dostaneš do situace, kdy to vlákno bude čekat navždycky).

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
28.3.2020 23:19
2 + 2 = 5 for extremely large values of 2
Avatar
Developer123
Člen
Avatar
Odpovídá na Martin Dráb
Developer123:29.3.2020 12:27

Veľmi pekne ďakujem za nasmerovanie - večer to prepíšem na CreateProcess resp jeho widestringovú variantu CreateProcessW. A pri čítaní z pipe pojdem asi tou asynchrónnou cestou (ak to nebude moc komplikované). Ďakujem zatiaľ :)

Editováno 29.3.2020 12:27
Nahoru Odpovědět
29.3.2020 12:27
YOLO
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.