Мой CEA_schwing.exe читает файл «SINGLE_TP.inp» из той же директории. это работает нормально, когда я запускаю die exe через Windows Explorer.
Но, запустив .exe через мою программу на С ++, он больше не может найти файл. Кто-нибудь знает, почему он больше не получает файл?
Решение
rt.c_str() должен быть первым параметром в CreateProcess() ,
Более того, вы смешиваете ANSI и Unicode. Вы явно компилируете для Unicode, где CreateProcess() карты для CreateProcessW() , std::string содержит char данные, так c_str() возвращает const char * указатель, но CreateProcessW() ожидает wchar_t* указатель вместо. Кастинг с (LPWSTR)rt.c_str() просто скроет ошибку компилятора, но не решит проблему передачи данных ANSI туда, где ожидаются данные Unicode.
Вместо этого используйте широкую строку при объявлении строк Unicode (обратите внимание на L префикс):
std::wstring rt = L»C:/IPSE_temp/CEA_schwing.exe»; if (CreateProcess(rt.c_str(), NULL, NULL, NULL, TRUE, 0, NULL, NULL, processInfo)) .
Это работает, потому что rt.c_str() теперь совместим с первым параметром CreateProcess() , который является LPCWSTR и примет const wchar_t * указатель от c_str() (второй параметр не принимает const указатель).
ОКОННОЕ ПРИЛОЖЕНИЕ С НУЛЯ — ПОЛНЫЙ БАЗОВЫЙ КУРС C++ WINAPI
Кроме того, вы можете объявить wchar_t buf[MAX_PATH] и использовать его в качестве второго параметра в CreateProcess() , который имеет тип LPWSTR (Неконстантный):
wchar_t buf[MAX_PATH]; wcscpy_s(buf, L»C:/IPSE_temp/CEA_schwing.exe»); CreateProcess(0, buf, . );
Вы также можете установить рабочий каталог в 8-м параметре:
wchar_t buf[MAX_PATH]; wcscpy_s(buf, L»C:\IPSE_temp\CEA_schwing.exe»); std::wstring dir = L»C:\IPSE_temp»; CreateProcess(0, buf, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, dir.c_str(), pi);
Другие решения
Других решений пока нет …
Источник: web-answers.ru
Winapi как запустить программу
Запускать внешние программы бывает нужно не часто. Но вот есть такое техническое решение. Я знаком с несколькими программами имеющими понятие горячей связи. То есть вы можете к своим объектам привязать данные из других программ.
Например, такой подход есть в ГИС системе ArcView Вы заполняете поле в базе данных именем файла и пишите скрипт на языке AVENUE, в котором вызываете программу и передаете в параметры имя файла для открытия. Идея хороша тем, что позволяет внутри одной программы связать много разных данных.
Реализуется данная возможность на основе функции Windows с названием WinExec. Вот её описание.
UINT WinExec( LPCSTR lpCmdLine, // строка с именем программы UINT uCmdShow // вид вывода на экран в смысле //скрытая или нормальная и так далее );
А вот и код с примером, который запускает обычный калькулятор:
// ExecTest.cpp : Defines the entry point for the console application. // #include «stdafx.h» #include «windows.h» #include «iostream.h» void main()
Язык Си — Как создать и открыть окно с помощью функций WinAPI.
Да эта функция реализованна только для совместимости с Win 16 приложениями, а приложения Win 32 должны реализовывать данную возможность через CreateProcess.
Результатом этой функции может быть несколько кодов, но если код возврата больше 31, то функция выполнена успешно. Вот некоторые коды:
ERROR_BAD_FORMAT формат exe файла неверен ERROR_FILE_NOT_FOUND файл не найден ERROR_PATH_NOT_FOUND путь не найден
Источник: firststeps.ru
Функция WinExec (winbase.h)
Примечание Эта функция предоставляется только для совместимости с 16-разрядной версией Windows. Приложения должны использовать функцию CreateProcess .
Синтаксис
UINT WinExec( [in] LPCSTR lpCmdLine, [in] UINT uCmdShow );
Параметры
Командная строка (имя файла и необязательные параметры) для выполнения приложения. Если имя исполняемого файла в параметре lpCmdLine не содержит путь к каталогу, система выполняет поиск исполняемого файла в следующей последовательности:
- Каталог, из которого загружено приложение.
- Текущий каталог.
- Системный каталог Windows. Функция GetSystemDirectory извлекает путь к этому каталогу.
- Каталог Windows. Функция GetWindowsDirectory извлекает путь к этому каталогу.
- Каталоги, перечисленные в переменной среды PATH.
Параметры отображения. Список допустимых значений см. в описании параметра nCmdShow функции ShowWindow .
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение больше 31.
Если функция завершается ошибкой, возвращаемое значение является одним из следующих значений ошибок.
Система не хватает памяти или ресурсов. | |
ERROR_BAD_FORMAT | Недопустимый файл .exe. |
ERROR_FILE_NOT_FOUND | Указанный файл не найден. |
ERROR_PATH_NOT_FOUND | Указанный путь не найден. |
Комментарии
Функция WinExec возвращается, когда запущенный процесс вызывает функцию GetMessage или достигается предел времени ожидания. Чтобы избежать ожидания задержки времени ожидания, вызовите функцию GetMessage как можно скорее в любом процессе, запущенном вызовом WinExec.
Замечания по безопасности
Имя исполняемого файла рассматривается как первая строка с разделителями пробелов в lpCmdLine. Если в имени исполняемого файла или пути есть пробел, существует риск того, что другой исполняемый файл может быть запущен из-за того, как функция анализирует пробелы. Следующий пример является опасным, так как функция попытается запустить «Program.exe», если она существует, вместо «MyApp.exe».
WinExec(«C:\Program Files\MyApp», . )
Если злоумышленнику нужно было создать приложение с именем «Program.exe» в системе, любая программа, которая неправильно вызывает WinExec с помощью каталога Program Files, будет запускать это приложение вместо предполагаемого приложения.
Чтобы избежать этой проблемы, используйте CreateProcess , а не WinExec. Однако если для устаревших причин необходимо использовать WinExec , убедитесь, что имя приложения заключено в кавычки, как показано в примере ниже.
WinExec(«»C:\Program Files\MyApp.exe» -L -S», . )
Требования
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Целевая платформа | Windows |
Header | winbase.h (включая Windows.h) |
Библиотека | Kernel32.lib |
DLL | Kernel32.dll |
Набор API | ext-ms-win-kernel32-process-l1-1-0 (представлено в Windows 10 версии 10.0.14393) |
Источник: learn.microsoft.com