Перейти к содержанию
    

Запуск программы из командной строки

Мне нужно чтобы в ходе выполнения моей программы при нажатии кнопки запускалась другая программа. Эта другая программа запускается из коммандной строки. Как это сделать в C++ Builder? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Только теперь такой вопрос - нужно чтобы кнопка была неактивной до завршения процесса. Как можно узнать момент его завершения? Если можно с примером. Ну пусть командная строка у нас будет "С:\format a:\f\g".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не получается ничего. Был бы благодарен за рабочий пример для 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 *')

Что тут можно предпринять?

 

Как я понимаю, нужно как-то правильно передать в функцию указатель на командную строку...

Изменено пользователем skyled

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делаю во так:

LPTSTR szCmdline = _tcsdup(TEXT("H:\program.exe"));
CreateProcess(NULL, szCmdline,NULL,NULL,FALSE,0,NULL,NULL,);

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

для начала попробуйте так

LPTSTR szCmdline = _tcsdup(TEXT("H:\\program.exe"))

 

 

 

Или вот слегка обезображеный мной и билдером пример из MSDN:

CrProc.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ругается как раз на нижнюю строчку

[C++ Error] Unit1.cpp(238): E2188 Expression syntax

 

Попробовал Ваш пример. Компилится, но в Memo1:

CreateProcess failed. Error code=123

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

 

 

Заработало. Спасибо.

Изменено пользователем skyled

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал Ваш пример. Компилится, но в Memo1:

CreateProcess failed. Error code=123

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

согласно MSDN это значит The filename, directory name, or volume label syntax is incorrect.

 

В моем примере строку char * command="C:\\WINDOWS\\NOTEPAD.EXE" откорректировали?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Копать в сторону стандартной С функции system, и не забивать себе голову вопросами, в которых не разбираетесь :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все уже работает. Я же уже писал. Теперь другая проблема. Та програмка, которую запкскаю кнопкой не видит файл, находящийся с ней же в одной папке. При этом если я в окошке командной строкой перемещаюсь в нужную папку (делаю ее текущей), то начинает видеть. Можно как-то при установке прописывать path ? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно как-то при установке прописывать path ?

Можно сформировать bat-файл, в котором делать cd по нужному пути и вызывать программу. Ну и запускать его вместо программы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь другая проблема. Та програмка, которую запкскаю кнопкой не видит файл, находящийся с ней же в одной папке. При этом если я в окошке командной строкой перемещаюсь в нужную папку (делаю ее текущей), то начинает видеть. Можно как-то при установке прописывать path ? Спасибо.

Самому проверять лень, но в описании CreateProcess есть же параметр lpCurrentDirectory. Попробуйте рулить через него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А для быстрого выполнения команд есть WinExec(); но там кажется ожидание завершения процесса не организовать никак :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CreateProcess() - не отрабатывает ассоциации. То есть, нельзя сделать CreateProcess(NULL, "help.html"...); Хотя для запуска известного экзешника - нормально.

ShellExecute() - правильный путь :) (И параметр lpDirectory там тоже имеется).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...