Warsztat - Programowanie gier

Lipiec 30, 2010, 17:31:10 *
Witamy, Gość. Zaloguj się, lub zarejestruj proszę.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Warsztat, Regulamin forum, #warsztat, Wiki, FAQ, NoPaste, Mapa
 
   Strona główna   Pomoc Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: CreateProcess i cmd.exe  (Przeczytany 637 razy)
DoS
Full Member
***

wiadomości: 150


Ehm... nope.


Zobacz profil WWW
« : Marzec 06, 2010, 14:00:29 »

Hej,

natchniony (a może podjarany) wpisem na xion.log o tym by stworzyć sobie nakładkę na konsolę w windzie wziąłem się do pracy. Wygooglałem o poszukałem sobie informacji o pipe'each, o createprocess, a nawet przeczytałem kilka artykułów prosto z msdn'a typu "how to spawn console proces with redirect input/output". Wszystko ładnie pięknie by chodziło gdyby nie to, że proces, który tworzę, zaraz kończy swoje działanie. Najbardziej irytuje mnie to, że mimo przeglądnięcia wielu wątków i forów na ten temat, wydaje mi się jakby nikt inny poza mną nie miał tego problemu. Sad
Kod:
SECURITY_ATTRIBUTES atr;
atr.bInheritHandle = true;
atr.nLength = sizeof(SECURITY_ATTRIBUTES);
atr.lpSecurityDescriptor = NULL;

CreatePipe(&writein, &readin, &atr, 0);
CreatePipe(&writeout, &readout, &atr, 0);

PROCESS_INFORMATION pinfo;
STARTUPINFO sinfo;

ZeroMemory(&pinfo, sizeof(PROCESS_INFORMATION));
ZeroMemory(&sinfo, sizeof(STARTUPINFO));

sinfo.cb = sizeof(STARTUPINFO);
sinfo.hStdError = writeout;
sinfo.hStdOutput = writeout;
sinfo.hStdInput = readin;
sinfo.wShowWindow = SW_SHOWDEFAULT;
sinfo.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;


BOOL create = CreateProcess(L"C:\\Windows\\System32\\cmd.exe", 0, 0, 0, true, CREATE_NEW_CONSOLE, 0, 0, &sinfo, &pinfo);

Z początku myślałem, że błąd jest dalej (nie wysyła i odpiera przez pipe) ale później dodałem parametry CREATE_NEW_CONSOLE i zobaczyłem jak okienko pojawia się i znika.  Kombinowałem z różnymi parametrami ale widzę, że nie tędy droga.
Jak sprawić by stworzyć proces uruchamiający konsolę ta by można było z niej korzystać przez pipe'y?

-Jacek
Zapisane

ORC |||||||||| 20%
ConayR
SuperHero Member
******

wiadomości: 1388


Cheers!


Zobacz profil
« Odpowiedz #1 : Marzec 06, 2010, 16:08:48 »

Nie wiem czy o to w tym konkretnym przypadku chodzi, ale "trwała" konsola wymaga /k. Może to tymczasowa natura konsoli wpływa na zachowanie w Twoim przypadku użycia, może nie. Spróbować możesz.
Zapisane

On the Internet, nobody knows you're a dog
DoS
Full Member
***

wiadomości: 150


Ehm... nope.


Zobacz profil WWW
« Odpowiedz #2 : Marzec 06, 2010, 18:18:47 »

Myślę, że to dobry pomysł z tym parametrem. Z samego uruchom systemowego wszystko działa tak jak msdn, lecz niestety nie ma tego parametru gdzie przemycić. Gdy dodam go do ścieżki to nie tworzy procesu w ogóle. Gdy dodam do lpCommandLine: nic się nie dzieje. W strukturze LPSTARTUPINFO też nie widać miejsca na parametry uruchomiania.


(tak po cichu to mam nadzieję, że wątek zauważy sam Xion Grin)
Zapisane

ORC |||||||||| 20%
Xion
Member2000
*******

wiadomości: 2507



Zobacz profil WWW
« Odpowiedz #3 : Marzec 06, 2010, 18:33:14 »

CreateProcess nie ma osobnego parametru dla argumentów uruchamianego programu. Ma za to jeden dla nazwy pliku wykonywalnego, a drugi dla wiersza polecenia. Używasz tego pierwszego; użyj drugiego (i tylko tego drugiego, czyli "cmd /k" w twoim przypadku).
Nie jestem aczkolwiek przekonany czy to coś pomoże. /k używa się po to, żeby odpalić wiersz poleceń, podać mu jakieś polecenie i sprawić, żeby po jego wykonaniu konsola się nie zamknęła (np. "cmd /k cd c:\windows". Zgaduję, że to niezupełnie to, czego potrzebujesz. A cmd bez /k samo się nie zamknie, co można zauważyć chociażby odpalając wiersz polecenia przez Start > Uruchom > cmd.

Nie wiem natomiast po co ci CREATE_NEW_CONSOLE. Jeśli chcesz zrobić nakładkę na konsolę, to chyba ostatnią rzeczą której potrzebujesz jest okienko konsoli windowsowej - a właśnie to ci gwarantuje, że takowe się pojawi. Daj raczej CREATE_NO_WINDOW.
Zapisane

DoS
Full Member
***

wiadomości: 150


Ehm... nope.


Zobacz profil WWW
« Odpowiedz #4 : Marzec 06, 2010, 18:56:20 »

Niestety, na kodzie dostaje:
Kod:
CreateProcess(0, L"cmd ", 0, 0, true, 0, 0, 0, &sinfo, &pinfo);

Unhandled exception/Access violation writing location
Po czym debugger przenosi mnie jak zwykle w jakieś odległe miejsce, tym razem do biblioteki ostream.
Sprawdziłem, że uchwyty pipe tworzą się poprawnie.
Zapisane

ORC |||||||||| 20%
Strony: [1]
  Drukuj  
 
Skocz do:  

Hosting: Polska Strefa - Ogłoszenia
Powered by SMF 1.1.7 | SMF © 2006, Simple Machines LLC