Winapi как запустить программу

Мой 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 не содержит путь к каталогу, система выполняет поиск исполняемого файла в следующей последовательности:

  1. Каталог, из которого загружено приложение.
  2. Текущий каталог.
  3. Системный каталог Windows. Функция GetSystemDirectory извлекает путь к этому каталогу.
  4. Каталог Windows. Функция GetWindowsDirectory извлекает путь к этому каталогу.
  5. Каталоги, перечисленные в переменной среды PATH.
Читайте также:
Ipconfig не является внутренней или внешней командой исполняемой программой или пакетным файлом

Параметры отображения. Список допустимых значений см. в описании параметра 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru