命令CreateProcess C ++

时间:2018-04-02 11:19:31

标签: c++ winapi createprocess waitforsingleobject

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

2 个答案:

答案 0 :(得分:0)

CreateProcess函数只能启动.exe和.bat文件。如果您希望ShellExecute[Ex]与shell / Explorer相同,请使用launch files

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

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

答案 1 :(得分:0)

如果您只想使用defualt app打开现有图片,请使用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(新手的产生过程基本指南)。