C++ CreateProcess与系统程序一起失败?

C++ CreateProcess与系统程序一起失败?,c++,windows,winapi,64-bit,createprocess,C++,Windows,Winapi,64 Bit,Createprocess,打印CreateProcess(n):0\nGLE:0,并且没有启动任何程序。 然而,当我将文件位置替换为C:\\Windows\\Notepad.exe时,记事本将启动。 (x64项目在x64 Windows 10上执行)。如评论所述,由于在CreateProcess之前调用了GetLastError,因此收到的错误代码为0 如果调用正确,它将返回错误error\u ELEVATION\u REQUIRED: STARTUPINFO si = {sizeof(STARTUPINFO)}

打印
CreateProcess(n):0\nGLE:0
,并且没有启动任何程序。 然而,当我将文件位置替换为
C:\\Windows\\Notepad.exe
时,记事本将启动。
(x64项目在x64 Windows 10上执行)。

如评论所述,由于在
CreateProcess
之前调用了
GetLastError
,因此收到的错误代码为0

如果调用正确,它将返回错误
error\u ELEVATION\u REQUIRED

    STARTUPINFO si = {sizeof(STARTUPINFO)};
    PROCESS_INFORMATION pi;
    si.cb = sizeof(STARTUPINFO);

    printf("CreateProcess(n): %x\nGLE: %x\n", CreateProcess(L"C:\\Windows\\System32\\osk.exe", NULL, 0, 0, false, NULL, 0, 0, &si, &pi), GetLastError());

Microsoft建议您使用:


不要依赖于函数参数的求值顺序。“C++”完全是可能的,它首先调用了代码“GETLASTOrror ”,这使得代码更难读取嵌入在<代码> Prtff中的两个代码。@克里斯“不依赖于函数参数的评价顺序”-Irc,现代C++实际上纠正了这一点,因此评估顺序将按预期做正确的事情。但是,是的,这个代码不是一个好方法
CreateProcess()
GetLastError()
应单独调用,并将结果保存到变量中,然后将变量传递到
printf()
。无关:行
si.cb=sizeof(STARTUPINFO)看起来不必要,因为您已经在初始化中设置了
cb
。@RemyLebeau,它们现在被排序了,所以
f(i++,i++)
是“好的”,但顺序仍然取决于编译器。
GetLastError
在您的案例中在
CreateProcess
之前调用。如果在正确的时间调用它-
错误\u需要提升
-请求的操作需要提升。将。
    STARTUPINFO si = { sizeof(STARTUPINFO) };
    PROCESS_INFORMATION pi;
    si.cb = sizeof(STARTUPINFO);
    CreateProcess(L"C:\\Windows\\System32\\osk.exe", NULL, 0, 0, false, NULL, 0, 0, &si, &pi);
    int e = GetLastError();
    printf("%d\n", e);
ShellExecute(NULL, L"open", L"C:\\Windows\\System32\\osk.exe", NULL, NULL, SW_SHOWNORMAL);