CreateProcessA% appdata% - PullRequest
       14

CreateProcessA% appdata%

0 голосов
/ 21 мая 2018

Я пытаюсь использовать CreateProcessA для вызова приложения из каталога %appdata%.

Например, используя следующее:

CreateProcessA(
    NULL, "%appdata%\myfile.exe", NULL, NULL, FALSE,
    CREATE_NO_WINDOW, NULL, NULL, &sI, &pI
);

Нужно ли использоватьполный путь при вызове myfile.exe или я могу использовать %appdata% при вызове CreateProcessA?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Второй параметр в CreateProcess должен быть буфером для записи.Если ваш путь к исполняемому файлу не содержит аргументов командной строки, укажите путь к исполняемому файлу в первом параметре и оставьте второй параметр NULL

Для Windows Vista и выше используйте SHGetKnownFolderPath

FOLDERID_LocalAppData возвращает "c:\\users\\username\\AppData\\Local"
FOLDERID_RoamingAppData возвращает "c:\\users\\username\\AppData\\Roaming"

ExpandEnvironmentStrings("%APPDATA%", ...) возвращает то же, что и FOLDERID_RoamingAppData

Вы должны использовать Unicode, если не уверены, что имя пользователя совместимо с ANSI.

wchar_t *ptr;
if(S_OK == SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &ptr))
{
    //or FOLDERID_LocalAppData
    std::wstring path = ptr;
    CoTaskMemFree(ptr);

    STARTUPINFOW si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    path += L"\\myfile.exe";
    CreateProcessW(NULL, &path[0], NULL, NULL, FALSE, 
            CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
}
0 голосов
/ 22 мая 2018

Как указано в MSDN , и поскольку вы передаете NULL в CreateProcessA в качестве первого аргумента, второй аргумент CreateProcessA: lpApplicationName играет роль командыстрока должна быть выполнена.Если lpApplicationName не указывает на исполняемый файл в каталоге, система будет искать его в следующем порядке

  1. Каталог, из которого загружено приложение.
  2. Текущийкаталог для родительского процесса.
  3. 32-разрядный системный каталог Windows.Используйте функцию GetSystemDirectory, чтобы получить путь к этому каталогу
  4. 16-разрядный системный каталог Windows.Не существует функции, которая получает путь к этому каталогу, но она ищется.Название этого каталога - System.Каталог Windows.Используйте функцию GetWindowsDirectory, чтобы получить путь к этому каталогу.
  5. Каталоги, перечисленные в переменной среды PATH.Обратите внимание, что эта функция не выполняет поиск пути для приложения, указанного в разделе реестра «Путь к приложению».Чтобы включить этот путь для каждого приложения в последовательность поиска, используйте функцию ShellExecute.

Поэтому, если второй аргумент CreateProcessA не имеет форму {directory}/{executable_name}.{ext}, вы будетенеобходимо:

  1. Поместить имя исполняемого файла в тот же каталог, из которого загружено приложение
  2. Поместить имя исполняемого файла в тот же каталог родительского процесса
  3. Поместить имя исполняемого файла вКаталог Windows System32: C: \ Windows \ System32
  4. Поместите имя исполняемого файла в каталог Windows: C: \ Windows
  5. Включите каталог, в котором имя исполняемого файла находится в ПУТИ

Как сказал Бен, посмотрите на ExpandEnvironmentStrings , чтобы изменить переменную PATH env.

...