skyled 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Мне нужно чтобы в ходе выполнения моей программы при нажатии кнопки запускалась другая программа. Эта другая программа запускается из коммандной строки. Как это сделать в C++ Builder? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
o-henry 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба С помощью WinAPI: CreateProcess или ShellExecute Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Спасибо. Только теперь такой вопрос - нужно чтобы кнопка была неактивной до завршения процесса. Как можно узнать момент его завершения? Если можно с примером. Ну пусть командная строка у нас будет "С:\format a:\f\g". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
o-henry 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба WaitForSingleObject пример. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 18 января, 2011 Опубликовано 18 января, 2011 (изменено) · Жалоба Что-то не получается ничего. Был бы благодарен за рабочий пример для 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 *') Что тут можно предпринять? Как я понимаю, нужно как-то правильно передать в функцию указатель на командную строку... Изменено 18 января, 2011 пользователем skyled Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
o-henry 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Делаю во так: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 18 января, 2011 Опубликовано 18 января, 2011 (изменено) · Жалоба Ругается как раз на нижнюю строчку [C++ Error] Unit1.cpp(238): E2188 Expression syntax Попробовал Ваш пример. Компилится, но в Memo1: CreateProcess failed. Error code=123 Где копать, не подскажете? Спасибо. Заработало. Спасибо. Изменено 18 января, 2011 пользователем skyled Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
o-henry 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Попробовал Ваш пример. Компилится, но в Memo1: CreateProcess failed. Error code=123 Где копать, не подскажете? Спасибо. согласно MSDN это значит The filename, directory name, or volume label syntax is incorrect. В моем примере строку char * command="C:\\WINDOWS\\NOTEPAD.EXE" откорректировали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Копать в сторону стандартной С функции system, и не забивать себе голову вопросами, в которых не разбираетесь :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Все уже работает. Я же уже писал. Теперь другая проблема. Та програмка, которую запкскаю кнопкой не видит файл, находящийся с ней же в одной папке. При этом если я в окошке командной строкой перемещаюсь в нужную папку (делаю ее текущей), то начинает видеть. Можно как-то при установке прописывать path ? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Можно как-то при установке прописывать path ? Можно сформировать bat-файл, в котором делать cd по нужному пути и вызывать программу. Ну и запускать его вместо программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
o-henry 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба Теперь другая проблема. Та програмка, которую запкскаю кнопкой не видит файл, находящийся с ней же в одной папке. При этом если я в окошке командной строкой перемещаюсь в нужную папку (делаю ее текущей), то начинает видеть. Можно как-то при установке прописывать path ? Спасибо. Самому проверять лень, но в описании CreateProcess есть же параметр lpCurrentDirectory. Попробуйте рулить через него. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба А для быстрого выполнения команд есть WinExec(); но там кажется ожидание завершения процесса не организовать никак :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 18 января, 2011 Опубликовано 18 января, 2011 · Жалоба CreateProcess() - не отрабатывает ассоциации. То есть, нельзя сделать CreateProcess(NULL, "help.html"...); Хотя для запуска известного экзешника - нормально. ShellExecute() - правильный путь :) (И параметр lpDirectory там тоже имеется). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться