【问题标题】:The Command CreateProcess C++命令 CreateProcess C++
【发布时间】:2018-04-02 11:19:30
【问题描述】:

命令 CreateProcess 和命令 WaitForSingleObject 可以打开图片吗? 如果是 我如何打开图像? 我试图打开但我不知道在哪里打开路径

    if (CreateProcess(NULL, "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Paint.lnk", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
        WaitForSingleObject(pi.hProcess, INFINITE);

        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
    }

【问题讨论】:

标签: c++ winapi createprocess waitforsingleobject


【解决方案1】:

如果您只想使用默认应用打开现有图像,请使用ShellExectue API。例如:

ShellExecuteW(NULL, L"open", L"Z:\\cat.PNG", NULL, NULL, SW_SHOW);

您也可以使用相同的 API 使用 mspaint 打开图像:

ShellExecuteW(NULL, L"open", L"C:\\Windows\\system32\\mspaint.exe", L"Z:\\cat.PNG", NULL, SW_SHOW);

ShellExecuteEx 会让你等待完成过程。

您可以使用CreateProcess 执行相同的操作。正如@DavidHeffernan 指出的CreateProcess 的第二个参数应该指向可写内存,否则会引发访问冲突。为了清楚起见,我将省略第一个参数。示例:

STARTUPINFOW process_startup_info{ 0 };
process_startup_info.cb = sizeof(process_startup_info); // setup size of strcture in bytes

PROCESS_INFORMATION process_info{ 0 };

wchar_t commandline_args[] = L"\"C:\\Windows\\system32\\mspaint.exe\" Z:\\cat.PNG";

if (CreateProcessW(NULL, commandline_args, NULL, NULL, TRUE, 0, NULL, NULL, &process_startup_info, &process_info))
{
    //WaitForSingleObject(process_info.hProcess, INFINITE); // uncomment to wait till process finish
    CloseHandle(process_info.hProcess);
    CloseHandle(process_info.hThread);
}

我强烈建议阅读this CodeProject article(新手的产卵过程基本指南)。

【讨论】:

  • 这是一个糟糕的答案。 CreateProcess 对问题中描述的任务没有用。即使是这样,传递一个文字广告第二个参数肯定会失败。 ShellExecuteEx 将允许您等待新进程。但是不会有新的流程,所以也没有用。
  • @DavidHeffernan 我应该说 ShellExecute 是一个更好的选择。我说它将允许等待过程完成。问题不准确。但是,我认为最好提供 CreateProcess 的工作代码(作为 OP 使用 CreateProcess 发布的代码)。你说“但不会有新的流程,所以也没用。” - 你能解释一下那部分吗?
  • 您的 CreateProcess 代码不起作用。我解释了原因。通过 shell 打开图像时,不会创建新进程。
  • @DavidHeffernan 你是对的。这个函数的第二个参数是 INOUT 并且应该指向可写内存,因为 CreatProcess 可以修改这个字符串。这就是我提供第一个参数的原因。它不会引发访问冲突异常(或者它不应该因为我不是 100% 确定它不会在所有情况下,但如果我需要快速检查某些东西,这就是我所做的)。无论如何,我同意你的看法,应该有指向可写内存的指针。刚刚编辑了我的答案以使事情变得清晰。
  • 说到 ShellExecuteEx.. 你是想说 SEE_MASK_NOCLOSEPROCESS 掩码不起作用吗?我刚刚检查了 CodeProject 文章中的代码。它确实按预期工作。
【解决方案2】:

CreateProcess 函数只能启动 .exe 和 .bat 文件。如果您想像 shell/Explorer 一样使用 launch files,请使用 ShellExecute[Ex]

一个进程必须有一个 PE EXE 文件作为它的主文件,如果你要求CreateProcess 启动其他东西,它只会失败。 ShellExecute 将在注册表中查找文件扩展名以找到要执行的正确可执行文件(或 COM 处理程序),这通常会以您指定为命令行参数的文件的名义代表您调用 CreateProcess

ShellExecuteExSEE_MASK_NOCLOSEPROCESS 标志一起使用可能 可能会给您一个可以等待的进程句柄,但您还必须为hProcess 为NULL 做好准备。如果该文件类型的注册应用程序已在运行,并且已使用 DDE 或 COM 在此现有应用程序实例中打开文件,则可能会发生这种情况...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多