реклама на сайте
подробности

 
 
> Запуск программы из командной строки, в ходе выполнения другой программы (C++ Builder)
skyled
сообщение Jan 11 2011, 08:55
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Мне нужно чтобы в ходе выполнения моей программы при нажатии кнопки запускалась другая программа. Эта другая программа запускается из коммандной строки. Как это сделать в C++ Builder? Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 13)
o-henry
сообщение Jan 11 2011, 09:04
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



С помощью WinAPI: CreateProcess или ShellExecute
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 11 2011, 09:39
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Спасибо. Только теперь такой вопрос - нужно чтобы кнопка была неактивной до завршения процесса. Как можно узнать момент его завершения? Если можно с примером. Ну пусть командная строка у нас будет "С:\format a:\f\g".
Go to the top of the page
 
+Quote Post
o-henry
сообщение Jan 11 2011, 09:56
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



WaitForSingleObject
пример.
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 18 2011, 10:31
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Что-то не получается ничего. Был бы благодарен за рабочий пример для 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 - Jan 18 2011, 11:27
Go to the top of the page
 
+Quote Post
o-henry
сообщение Jan 18 2011, 11:52
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



Цитата(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:
Прикрепленные файлы
Прикрепленный файл  CrProc.zip ( 3.97 килобайт ) Кол-во скачиваний: 14
 
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 18 2011, 12:35
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Ругается как раз на нижнюю строчку
Код
[C++ Error] Unit1.cpp(238): E2188 Expression syntax


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

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


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

Сообщение отредактировал skyled - Jan 18 2011, 12:31
Go to the top of the page
 
+Quote Post
o-henry
сообщение Jan 18 2011, 12:36
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



Цитата(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" откорректировали?
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 18 2011, 12:42
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Копать в сторону стандартной С функции system, и не забивать себе голову вопросами, в которых не разбираетесь sm.gif
Go to the top of the page
 
+Quote Post
skyled
сообщение Jan 18 2011, 13:38
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



Все уже работает. Я же уже писал. Теперь другая проблема. Та програмка, которую запкскаю кнопкой не видит файл, находящийся с ней же в одной папке. При этом если я в окошке командной строкой перемещаюсь в нужную папку (делаю ее текущей), то начинает видеть. Можно как-то при установке прописывать path ? Спасибо.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 18 2011, 13:57
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(skyled @ Jan 18 2011, 18:38) *
Можно как-то при установке прописывать path ?

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
o-henry
сообщение Jan 18 2011, 14:04
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



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

Самому проверять лень, но в описании CreateProcess есть же параметр lpCurrentDirectory. Попробуйте рулить через него.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 18 2011, 16:28
Сообщение #13


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 18 2011, 16:43
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016