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