ShellExecute, CreateProcess - uruchamianie programu zewnętrznego oraz komendy zawarte w pliku

ShellExecute, CreateProcess - uruchamianie programu zewnętrznego oraz komendy zawarte w pliku
0

Witam,

Zależy mi na tym, aby kod nad którym pracuję uruchamiał aplikację (np. avl.exe) i następnie aplikacja ta wykonywała polecenia zawarte w pliku (np. avl_script.txt). Do tej pory sprawę załatwiała mi komenda:

Kopiuj
system("call avl < avl_script.txt > avl_log.txt");

Chciałbym jednak mieć większą kontrolę nad tym procesem. Wiem, że umożliwiają to funkcje takie jak ShellExecute czy CreateProcess, jednak nie potrafię za ich pomocą wykonać takiej samej czynności jak z pomocą powyższej komendy system(). Chodzi konkretnie o wczytanie komend z pliku skryptowego i ich wykonanie przez wywoływaną aplikację. Zalezy mi ponadto na możliwości zakończenia procesu (funkcja system() tego nie umożliwia), co z kolei wymaga znajomości jego PIDa jak się domyślam.

Jestem początkującym programistą. Proszę o pomoc i radę.

stryku
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:607
0

Przykładowy kod

Kopiuj
int main(int argc, char* argv[])
{
    PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter

    STARTUPINFO StartupInfo; //This is an [in] parameter

    ZeroMemory(&StartupInfo, sizeof(StartupInfo));
    StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field

    LPTSTR cmdArgs = "D:\\email\\avl.exe < avl_script.txt > avl_log.txt";

    if(CreateProcess("D:\\email\\avl.exe", cmdArgs, 
        NULL,NULL,FALSE,0,NULL,
        NULL,&StartupInfo,&ProcessInfo))
    { 
        WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hProcess);

        printf("Yohoo!");
    }  
    else
    {
        printf("The process could not be started...");
    }

    return 0;
} 

Przerobiony kod z tego: http://stackoverflow.com/questions/1135784/createprocess-doesnt-pass-command-line-arguments

Dodam, że nie testowałem tego bo jetem na linuxie, ale powinno hulać. Zmień sobie ścieżkę do avl.exe tylko

0

Dzięki za szybka odpowiedź.

Niestety podany kod nie robi do końca tego samego, co wspomniana przeze mnie funkcja system. Umożliwia on co prawda uruchomienie programu wraz z dolaczonymi argumentami, ale nie o to mi do końca chodzi.

W przypadku funkcji system(call...) uruchamiany program jest sterowany zgodnie z zawartością pliku skryptowego (nazwa pliku w nawiasach ostrych), dokładnie w ten sposób jakby to użytkownik kolejno wpisywal polecenia w wierszu poleceń wywolywanego programu. I o to dokładnie mi chodzi - jest to nieco odmienna sytuacja niż wywołanie programu z argumentami (tak mi się zdaje..)

Pozdrawiam i czekam na dalszą pomoc.

0

Dzięki za szybka odpowiedź.

Niestety podany kod nie robi do końca tego samego, co wspomniana przeze mnie funkcja system. Umożliwia on co prawda uruchomienie programu wraz z dolaczonymi argumentami, ale nie o to mi do końca chodzi.

W przypadku funkcji system(call...) uruchamiany program jest sterowany zgodnie z zawartością pliku skryptowego (nazwa pliku w nawiasach ostrych), dokładnie w ten sposób jakby to użytkownik kolejno wpisywal polecenia w wierszu poleceń wywolywanego programu. I o to dokładnie mi chodzi - jest to nieco odmienna sytuacja niż wywołanie programu z argumentami (tak mi się zdaje..)

Pozdrawiam i czekam na dalszą pomoc.

stryku
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:607
0

A kompilowałeś i uruchamiałeś to moje? Mi się wydaję, że powinno zadziałać tak samo. Przecież podajesz na wejście plik avl_sccript.txt. To działa tak samo jakbyś wpisywał po kolei z klawiatury polecenia

0

Kompilowalem i uruchamiany program próbuje traktować pierwszy ostry nawias < jako argument (komende), zamiast odczytywać dane z pliku którego nazwa jest podana za nawiasem.. Prowadzi to oczywiście do wykrzaczenia się programu.

stryku
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:607
0
0

Nie widziałem, ale chyba pozostanę przy "swoim" system(...), jeżeli aż tak skomplikowany kod jest do tego potrzebny... Tak czy inaczej, dzięki za pomoc!

06
Aż tak skomplikowany kod nie jest potrzebny. Jeśli dobrze pamiętam, wystarczy że przypiszesz polom STARTUPINFO::hStdInput i STARTUPINFO::hStdOutput uchwyty do plików 'avl_script.txt' i 'avl_log.txt'.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.