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:

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ę.

0

Przykładowy kod

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.

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.

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!

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