-4

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);
    }
4

2 回答 2

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);
}

我强烈推荐阅读这篇 CodeProject 文章(A newbie's basic guide to spawn processes)。

于 2018-04-02T12:47:07.687 回答
0

CreateProcess函数只能启动 .exe 和 .bat 文件。ShellExecute[Ex]如果您想以与 shell/Explorer 相同的方式启动文件,请使用。

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

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

于 2018-04-02T11:58:37.963 回答