Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запуск программы из командной строки
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
skyled
Мне нужно чтобы в ходе выполнения моей программы при нажатии кнопки запускалась другая программа. Эта другая программа запускается из коммандной строки. Как это сделать в C++ Builder? Спасибо.
o-henry
С помощью WinAPI: CreateProcess или ShellExecute
skyled
Спасибо. Только теперь такой вопрос - нужно чтобы кнопка была неактивной до завршения процесса. Как можно узнать момент его завершения? Если можно с примером. Ну пусть командная строка у нас будет "С:\format a:\f\g".
o-henry
WaitForSingleObject
пример.
skyled
Что-то не получается ничего. Был бы благодарен за рабочий пример для Borland C++ 6. Спасибо.

Делаю во так:
Код
LPTSTR szCmdline = _tcsdup(TEXT("H:\program.exe"));
CreateProcess(NULL, szCmdline,NULL,NULL,FALSE,0,NULL,NULL,);

Ругается на синтаксис.

Вот еще функцию из примера попробовал:

Код
void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process.
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    )
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }
    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );
    // Close process and thread handles.
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

Вызываю так:
Код
_tmain(0, "H:\program -o - p");


Ругается:
Код
[C++ Error] Unit1.cpp(239): E2034 Cannot convert 'char *' to 'char * *'
[C++ Error] Unit1.cpp(239): E2342 Type mismatch in parameter 'argv' (wanted 'char * *', got 'char *')
Что тут можно предпринять?

Как я понимаю, нужно как-то правильно передать в функцию указатель на командную строку...
o-henry
Цитата(skyled @ Jan 18 2011, 12:31) *
Делаю во так:
Код
LPTSTR szCmdline = _tcsdup(TEXT("H:\program.exe"));
CreateProcess(NULL, szCmdline,NULL,NULL,FALSE,0,NULL,NULL,);

Ругается на синтаксис.

для начала попробуйте так
LPTSTR szCmdline = _tcsdup(TEXT("H:\\program.exe"))



Или вот слегка обезображеный мной и билдером пример из MSDN:
skyled
Ругается как раз на нижнюю строчку
Код
[C++ Error] Unit1.cpp(238): E2188 Expression syntax


Попробовал Ваш пример. Компилится, но в Memo1:
Код
CreateProcess failed. Error code=123

Где копать, не подскажете? Спасибо.


Заработало. Спасибо.
o-henry
Цитата(skyled @ Jan 18 2011, 14:24) *
Попробовал Ваш пример. Компилится, но в Memo1:
Код
CreateProcess failed. Error code=123

Где копать, не подскажете? Спасибо.
согласно MSDN это значит The filename, directory name, or volume label syntax is incorrect.

В моем примере строку char * command="C:\\WINDOWS\\NOTEPAD.EXE" откорректировали?
XVR
Копать в сторону стандартной С функции system, и не забивать себе голову вопросами, в которых не разбираетесь sm.gif
skyled
Все уже работает. Я же уже писал. Теперь другая проблема. Та програмка, которую запкскаю кнопкой не видит файл, находящийся с ней же в одной папке. При этом если я в окошке командной строкой перемещаюсь в нужную папку (делаю ее текущей), то начинает видеть. Можно как-то при установке прописывать path ? Спасибо.
AHTOXA
Цитата(skyled @ Jan 18 2011, 18:38) *
Можно как-то при установке прописывать path ?

Можно сформировать bat-файл, в котором делать cd по нужному пути и вызывать программу. Ну и запускать его вместо программы.
o-henry
Цитата(skyled @ Jan 18 2011, 15:38) *
Теперь другая проблема. Та програмка, которую запкскаю кнопкой не видит файл, находящийся с ней же в одной папке. При этом если я в окошке командной строкой перемещаюсь в нужную папку (делаю ее текущей), то начинает видеть. Можно как-то при установке прописывать path ? Спасибо.

Самому проверять лень, но в описании CreateProcess есть же параметр lpCurrentDirectory. Попробуйте рулить через него.
sigmaN
А для быстрого выполнения команд есть WinExec(); но там кажется ожидание завершения процесса не организовать никак sad.gif
AHTOXA
CreateProcess() - не отрабатывает ассоциации. То есть, нельзя сделать CreateProcess(NULL, "help.html"...); Хотя для запуска известного экзешника - нормально.
ShellExecute() - правильный путь sm.gif (И параметр lpDirectory там тоже имеется).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.