Как запустить одну программу из другой?
Существует несколько способов запуска одной программы из другой.
1. WinExec - устаревшая функция, используется только для совместимости с 16-битной Windows. Не рекомендуется к использованию в Win32-приложениях.
2. CreateProcess - замена WinExec для Win32.
LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation); |
Параметры:
| lpApplicationName | имя программы |
| lpCommandLine | параметры командной строки |
| lpProcessAttributes | атрибуты безопасности процесса (имеет смысл только в NT/2000) |
| lpThreadAttributes | атрибуты безопасности главного потока (имеет смысл только в NT/2000) |
| bInheritHandles | если bInheritHandles == TRUE, то созданный процесс (запущенная программа), наследует дескрипторы (handles) запускающей программы |
| dwCreationFlags | параметры создания. Здесь можно указать класс приоритета создаваемого процесса и некоторые дополнительные параметры |
| lpEnvironment | указатель на блок окружения или NULL, тогда используется блок окружения родителя |
| lpCurrentDirectory | текущая директория или NULL, тогда используется текущая директория родителя |
| lpStartupInfo | указатель на структуру STARTUPINFO, которая определяет положение главного окна |
| lpProcessInformation | сюда будет записана информация о созданном процессе |
Пример запуска notepad.exe.
PROCESS_INFORMATION pi; GetStartupInfo(&si); if(!CreateProcess( "c:\\windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL,&si, &pi)) {// обработка ошибок } |
Следует обратить внимание на то, что указан полный путь к файлу notepad.exe. CreateProcess не производит поиск файлов в путях, указанных в переменной PATH.
3. ShellExecute и ShellExecuteEx - эти функции предназначены не только для запуска программ, но и для открытия и печати различных документов, т.е. запуска приложений, сопоставленных определенным типам файлов. Если, например, в качестве имени файла указать mydoc.doc, то будет запущено приложение, сопоставленное файлам с расширением doc (Microsoft Word). Функции ShellExecute и ShellExecuteEx в отличие от CreateProcess производят поиск файла в путях, указанных в переменной PATH.
HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory,INT nShowCmd ); |
Эта функция возвращает значение >32 в случае успешного выполнения и значение <= 32 в случае ошибки.
Параметры:
| hwnd | дескриптор родительского окна |
| lpOperation | строка, описывающая операцию: "open" - открытие (запуск), "print" - печать, "explore" - открыть окно с заданной папкой |
| lpFile | имя файла |
| lpParameters | параметры командной строки |
| lpDirectory | текущая директория для запускаемой программы |
| nShowCmd | параметр, указывающий, как будет показано приложение при открытии. Имеет тот же смысл, что и nCmdShow в WinMain |
Пример запуска notepad.exe:
NULL,"open", "notepad.exe", NULL, NULL, SW_SHOWNORMAL) <= 32) {// обработка ошибок } |
Пример открытия файла doc1.doc.
NULL,"open", "doc1.doc", NULL, NULL, SW_SHOWNORMAL) <= 32) {// обработка ошибок } |
LPSHELLEXECUTEINFO lpExecInfo); |
Формат структуры SHELLEXECUTEINFO:
DWORD cbSize; // размер структуры ULONG fMask; // маска, указывающая HWND hwnd; LPCTSTR lpVerb; // команда LPCTSTR lpFile; // имя файла LPCTSTR lpParameters; // параметры командной строки LPCTSTR lpDirectory; // текущая директория int nShow; // параметр, указывающий, как будет показано приложение при открытии. HINSTANCE hInstApp; // сюда будет записан hInstance приложения // Optional members LPVOID lpIDList; // IDL, определяющий файл для выполнения LPCSTR lpClass; // имя класса файла или GUID HKEY hkeyClass; // дескриптор ключа в реестре для класса файла DWORD dwHotKey; // горячая клавиша HANDLE hIcon; // иконка для класса файла HANDLE hProcess; // дескриптор процесса } SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO; |
Пример запуска notepad.exe:
SHELLEXECUTEINFO SHExecInfo;
SHExecInfo.cbSize = sizeof(SHExecInfo); SHExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;SHExecInfo.nShow = SW_SHOWNORMAL;SHExecInfo.lpFile = "notepad.exe"; if(!ShellExecuteEx(&SHExecInfo)) { // обработка ошибок } |
4. Функции, предоставляемые стандартной библиотекой языка программирования. Рассмотрение этих функций выходит за рамки данной статьи.
