createprocess:某些应用程序运行其他应用程序不运行

Posted

技术标签:

【中文标题】createprocess:某些应用程序运行其他应用程序不运行【英文标题】:createprocess: some applications run others do not 【发布时间】:2019-04-30 18:05:53 【问题描述】:

帮助我理解代码中的问题

#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

【问题讨论】:

在我的windows机器上,"(x86)"之前有一个空格。 2 = FILE_NOT_FOUND,仔细检查您创建的路径。 原谅我。我不专心。程序文件和 (x86) 之间的空间 你最好用 API 获取 Program Files 路径。 @JonathanPotter 对于原始字符串文字而言并非如此。 【参考方案1】:

不要对系统文件夹和系统应用程序的路径进行硬编码。(这可能会导致不同机器/不同时间出现错误,或拼写错误。)

@Remy Lebeau 提到,您可以使用SHGetFolderPath()SHGetKnownFolderPath() 来获得正确的Program Files 路径。或者您可以从注册表中获取真实路径。

这是我们可以摆脱硬代码路径的另一种简单方法。 iexplorewmplayer 都是 Windows 中的应用程序。您可以在命令行中以“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;

编辑:

或者你可以使用ShellExecute/Ex而不启动cmd而不是CreateProcess

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

【讨论】:

或者您也可以使用ShellExecute/Ex(),让它为您搜索“应用程序路径”,而无需使用cmd。这甚至在CreateProcess() 文档中也有说明

以上是关于createprocess:某些应用程序运行其他应用程序不运行的主要内容,如果未能解决你的问题,请参考以下文章

Createprocess控制台程序输出重定向

CreateProcess函数诡异的表现

vc++ 在程序中运行另一个程序的方法

vb用createprocess启动其他应用程序

用大量参数编译 GWT 代码——CreateProcess 的字符限制?

带有 DEBUG_PROCESS 标志的 CreateProcess 在某些可执行文件上导致错误 50