createprocess: некоторые приложения запускаются, другие - нет - PullRequest
0 голосов
/ 30 апреля 2019

Помогите мне понять проблему в моем коде

#include <Windows.h>
#include <iostream>

int main()
{
    STARTUPINFO si;
    ::ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    PROCESS_INFORMATION pi;
    ::ZeroMemory(&pi, sizeof(pi));

    //TCHAR cmd[] = TEXT(R"("c:\Program Files\Internet Explorer\iexplore.exe")");
    TCHAR cmd[] = TEXT(R"("c:\Program Files(x86)\Windows Media Player\wmplayer.exe")");
    BOOL res = ::CreateProcess(nullptr, cmd, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);

    //iexplore - run ok, wmplayer - false & getlasterror = 2

    return 0;
}

В чем моя проблема?

PS: Windows 10, Visual Studio 2017 CE, набор инструментов платформы v141

1 Ответ

0 голосов
/ 01 мая 2019

Не задавайте жесткие пути к системным папкам и системным приложениям (это может привести к ошибкам на разных компьютерах / в разное время или к орфографическим ошибкам.)

@ Реми Лебо предполагает, что вы можете использовать SHGetFolderPath() или SHGetKnownFolderPath(), чтобы получить правильный Program Files путь. Или вы можете получить реальный путь из реестра.

Вот еще один простой способ, которым мы можем выбрать пути жесткого кода. iexplore и wmplayer - оба приложения в окнах. Вы можете запустить его с «start appname» в командной строке (cmd.exe), или использовать код, как показано ниже:

#include <Windows.h>
#include <iostream>

int main()
{
    STARTUPINFO si;
    ::ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    PROCESS_INFORMATION pi;
    ::ZeroMemory(&pi, sizeof(pi));

    //TCHAR cmd[] = TEXT("cmd /c start iexplore");
    TCHAR cmd[] = TEXT("cmd /c start wmplayer");
    BOOL res = ::CreateProcess(NULL, cmd, nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);

    return 0;
}

EDIT:

Или вы можете использовать ShellExecute/Ex без запуска cmd вместо CreateProcess:

ShellExecuteA(NULL,NULL, "wmplayer",NULL, NULL, SW_NORMAL);
...