[c++] uruchamianie procesu ze sciezka ze spacja

0

Witam,

Chcę wywołać program, który znajduje się w pewnym katalogu. Ten folder zawiera spacje.

C:\Users\renegat\Documents\Visual Studio 2008\projects\program\Debug\program.exe

Kiedy próbuję uruchomić proces (inny program exe), zwraca on na standardowym wyjściu

Nazwa 'c:\Users\renegat\Documents\Visual' nie jest rozpoznawana jako polecenie wewnętrzne lub zewnętrzne, program wykonywalny lub plik wsadowy.

tak mniej więcej wywołuje program

    program=" /C "+program;
    bSuccess = CreateProcess("C:\\Windows\\System32\\cmd.exe", 
    (LPSTR)program.c_str() ,     // command line 
    NULL,          // process security attributes 
    NULL,          // primary thread security attributes 
    TRUE,          // handles are inherited 
    0,             // creation flags 
    NULL,          // use parent's environment 
    NULL,          // use parent's current directory 
    &siStartInfo,  // STARTUPINFO pointer 
    &piProcInfo);  // receives PROCESS_INFORMATION 
0

wyswietl sobie wartosc zmiennej PROGRAM po tym jak dokleiles do niej /c i nazwe programu i zastanow sie.. sprobuj wywolac taka linijke w konsoli systemowej - rowniez sie to nie powiedzie z tego samego wzgledu. zapomniales o cudzyslowach

0

wyświetliłem zmienną program, wygląda ona tak
cout: /C "c:\Users\renegat\Documents\Visual Studio 2008\Projects\rapidrenegatneo\rapidrenegatneo\curl.exe" -s -o ./temp/strona1.html http://google.com :coutend

najlepsze jest to, że jeśli wywołam tę komendę bezpośrednio w cmd.exe, to działa. Nie mam za bardzo pomysłu co z tym teraz zrobić. Powinno działać. Może wyświetlać znak po znaku, aby zobaczyć czy nie ma tam w środku jakichś dziwnych znaków?

ścieżkę bieżącą programu pobieram za pomocą _getcwd(buf,256);

0
ren. napisał(a)

wyświetliłem zmienną program, wygląda ona tak
cout: /C "c:\Users\renegat\Documents\Visual Studio 2008\Projects\rapidrenegatneo\rapidrenegatneo\curl.exe" -s -o ./temp/strona1.html http://google.com :coutend

najlepsze jest to, że jeśli wywołam tę komendę bezpośrednio w cmd.exe, to działa
Nie możliwe. Komenda nie może zaczynać się od ukośnika. Wpisałeś coś innego [glowa]

0

no racja, w cmd wywoływałem

"c:\Users\renegat\Documents\Visual Studio 2008\Projects\rapidrenegatneo\rapidrenegatneo\curl.exe" -s -o ./temp/strona1.html http://google.com

ale to nie zmienia faktu ze create process z przelacznikiem /c tez powinno ruszyc?

0

Bez cudzysłowu nie powinno (/c nie ma znaczenia). Jak nie ma zamknięcia w cudzysłowie spacja jest zawsze jak separator argumentów programu.

0

Gwoli ścisłości tak wywołując program w createprocess nie działa.

/C "c:\Users\renegat\Documents\Visual Studio 2008\Projects\rapidrenegatneo\rapidrenegatneo\curl.exe" -s -o ./temp/strona1.html http://google.com

wywołując natomiast w cmd.exe takie polecenie program działa

"c:\Users\renegat\Documents\Visual Studio 2008\Projects\rapidrenegatneo\rapidrenegatneo\curl.exe" -s -o ./temp/strona1.html http://google.com

z tego co widzę to jednak jest zamknięcie cudzysłowu po curl.exe, reszta rzeczy to parametry przekazywane do curl.exe. Zatem czy jest tu błąd, czy wywołując przez ścieżkę bezwzględną nie stworzę procesu?

0

1' wpisz na chama w create process parametr:

CreateProcess(
    "C:\\windows.....\\cmd.exe",
    "/C \"c:\\Users\\renegat\\Documents\\Visual Studio 2008\\Projects\\rapidrenegatneo\\rapidrenegatneo\\curl.exe\" -s -o .\temp\strona1.html \"http://google.com\"",
     ....., ...., ....);

i jesli to nie ruszy, zacytuj dokladnie komunikat bledu - byc moze sie zmienil od ostatniego razu. poprzednio wszystko wskazywalo na to ze te dluga sciezke do curl'a miales bez cudzyslowow i dlatego sadzil ze program do odpalenia to c\use\rene\docs\visual.exe.. teraz masz cudzyslowy, wiec sila rzeczy cos sie zmienic musialo

2' jesli w/w nie ruszy, zamiast curla sprobuj tez wykonac komende:
"/C echo 'ala' "ma" kota & dir "c:\program files\com*""
i zobaczymy czy createprocess/cmd.exe prawidlowo rozwiazuje apostrofy i nawiazy w linii komend..
powinienes otrzymac cos w stylu:

ala "ma" 'kotka'
 Wolumin w stacji C to system
 Numer seryjny woluminu: ...

 Katalog: c:\program files

2008-12-09  10:05    <DIR>          Common Files
               0 plik(ów)               0 bajtów
               1 katalog(ów)  .. bajtów wolnych
0

Ad1
drugi parametr funkcji createprocess to

"/C \"C:\\Users\\renegat\\Documents\\Visual Studio 2008\\Projects\\rapidrenegatneo\\rapidrenegatneo\\curl.exe\" -s -o c:/strona1.html \"www.google.com\"",

standardowe wyjście programu:

Nazwa 'C:\Users\renegat\Documents\Visual' nie jest rozpoznawana jako polecenie wewnętrzne lub zewnętrzne, program wykonywalny lub plik wsadowy.

Ad2
drugi parametr funkcji createprocess to

"/C echo 'ala' "ma" kota & dir "c:\program files\com*""

standardowe wyjście programu:

'ala' "ma" kota
Wolumin w stacji C to xxx
Numer seryjny woluminu: xxxx-xxxx

Katalog: c:\program files

2009-01-14 10:00 <DIR> Common Files
2008-10-14 12:17 <DIR> xxx
0 plik(ów) 0 bajtów
2 katalog(ów) 30 299 480 064 bajtów wolnych


OK. Znalazłem coś. Mógłbym to nazwać względnym rozwiązaniem mojego problemu. Otóż jeśli wcisnę w programie MS visual studio ctrl+f5 uruchomi mi się mój aktualnie tworzony program. Odpalony w taki sposób produkuje wyżej wymieniony błąd.
Jeśli natomiast uruchomię mój program normalnie (dwa razy na niego klikając na .exe w folderze debug), to program o dziwo działa.

Coś może można zmienić w ustawieniach visual studio?

0

nie, jednak pomyłka. ten plik .exe z folderu debug też nie działa.

0

z tego co wlasnie zauwazylem po sciezce, chyba masz Viste? to jak nazlosc u siebie nie sprawdze..
nie wiem, zglupialem. wyniki testu 100% ok - wszystko przekazane do cmd.exe jak nalezy. nie wiem czemu nie dziala.. raczej nie chodzi o ustawienia visuala.. strzelalbym w prawa dostepu - moze visual chodzi albo uruchamia programy jako inny uzytkownik i ow user nie ma dostepu do tej sciezki..

0

-tworzę proces, czyli wykonuje plik exe. Ten ów plik znajduje się w bezwzględnej ścieżce, która posiada spacje. Powstaje błąd. Niezależnie od konfiguracji. Testowałem to też na katalogu C:/sub dir/ wywołując curl.exe, który znajdował się w katalogu sub dir. Na xp działa jak powinno, czy też jest problem? Mógłby to ktoś sprawdzić?

Powód korzystania z ścieżki bezwzględnej, a nie relatywnej:
-Korzystam z ścieżki bezwzględnej nie bez powodu. Relatywna była dla mnie prostsza i bardziej sensowna. Mój program działa za pomocą drag & drop. Wystarczy na niego upuścić plik tekstowy, a on ściąga różne strony (to nie jest ważne). Drag & drop działa na winxp i winvista. Stwierdziłem, że wygodniej mi stworzyć własne rozszerzenie, więc plikom nadałem rozszerzenie .rpd i skojarzyłem je ze swoim programem. Po kliknięciu na plik o takim rozszerzeniu uruchamiał się na winvista mój program, z argumentami: 0- ścieżka samego programu exe; 1-plik tekstowy. Tak się dzieje, gdy się dwa razy klika na skojarzony z programem plik o konkretnym rozszerzeniu. Podczas gdy na moim systemie windows vista mogłem się w createprocess odnosić do curl.exe i mój program mimo iż był uruchomiony przez plik tekstowy korzystał z ścieżki bieżącej dla mojego programu (curl.exe znajduje się tam gdzie mój program .exe), to na systemie windows xp przy takim uruchomieniu już nie potrafił znaleźć curl.exe, który był tuż obok mojego execa. Nie wiem czemu, nie znam się, nie pytam. Chciałem więc korzystać z ścieżki bezwzględnej.
Piszę, gdyż może ktoś wie jak rozwiązać ten problem, a wtedy nie trzeba byłoby korzystać z ścieżki bezwzględnej.

-tak mam vistę, dostałem wraz z laptopem, nie chce mi się grzebać ze sterownikami to zostawiłem to co jest.

0

Ścieżki względne nie odnoszą się do katalogu w którym jest exe ! Każdy proces można uruchomić z różną ścieżką roboczą (tą do której odnoszą się ścieżki względne), każdy proces może ją zmieniać w trakcie działania.

Podczas uruchamiania programu w trybie debuging'u (F5) ścieżka robocza jest ustawiona na katalog w którym zapisany jest plik projektu .vcproj (można to zmienić w ustawieniach projektu "Debugger -> Working Directory"). Tak więc wszystkie ścieżki względne odnoszą się do katalogu projektu, a nie tego z .exe.

Ścieżka robocza cmd.exe odpalanego przez CreatProcess będzie taka sama jak ścieżka robocza programu wywołującego CreatProcess, dopóki nie podamy jej w parametrze lpCurrentDirectory.

Czyli i twój program i odpalony cmd.exe możne spokojnie używać ścieżek względnych tylko trzeba ustawić odpowiedni katalog roboczy.

No i ścieżka do cmd.exe może być różna, chociażby Windows wcale nie musi być na dysku C.

Poza tym dlaczego curl.exe uruchamiasz przez cmd.exe, a nie bezpośrednio ?

Ja to wiedzę jakoś tak:

//wyznaczamy ścieżkę do exe
basic_string<TCHAR> path = argv[0];
path.erase(path.last_index_of(TEXT("\\")) + 1);

CreateProcess(
   (TEXT('\"') + path + TEXT("curl.exe\"")).c_str(),
   TEXT("-s -o c:/strona1.html \"www.google.com\""),
   //...
   //możesz curl'owi podać ścieżkę roboczą np. taką:
   path.c_str(), //lpWorkingDirectory
   //...
);
0

Trafne uwagi, dzięki za pomoc. Wszystko już działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1