这是我的代码。我总是得到错误3,我该怎么办?我试图用CreateProcessA替换CreateProcces,替换前两个param,尝试处理其他程序,但它仍然不起作用。谢谢。
#include "windows.h"
#include <iostream>
void main() {
STARTUPINFOA cif;
ZeroMemory(&cif,sizeof(cif));
PROCESS_INFORMATION pi;
CreateProcessA("","C:\\Windows\\notepad.exe",NULL,NULL, NULL,NULL,NULL,NULL,&cif,&pi);
DWORD error=GetLastError();
std::cout << "error " << error << "\n";
while(1) {} // подождать
}
是的,你是对的。我已经纠正了它,但它仍然返回错误代码3。 首先,notepad.exe没有被执行,第二,getlasteeror返回代码错误3,我做错了什么?
我放置:
char* path="C:\\Windows\\notepad.exe";
CreateProcessA(path,"sfvfd",NULL,NULL,NULL,NULL,NULL,NULL,&cif,&pi);
而不是(并且它有效!):
CreateProcessA("","C:\\Windows\\notepad.exe",NULL,NULL,
NULL,NULL,NULL,NULL,&cif,&pi);
有什么区别?
答案 0 :(得分:2)
如果你仔细阅读,那是well documented on MSDN:
第一个参数lpApplicationName
:
要执行的模块的名称。 [...]
lpApplicationName参数可以为NULL。在这种情况下,模块名称必须是lpCommandLine字符串中第一个以空格分隔的标记。 [...]
出于某种原因,您不希望将模块名称放入第一个参数中。如果您然后传递NULL
作为参数,则可以。
然而,您将非NULL
指针传递给空字符串。因此API不会选择您的记事本路径,而是尝试运行空字符串。
Nence,3
= ERROR_PATH_NOT_FOUND
“系统无法找到指定的路径。”
答案 1 :(得分:1)
从MSDN示例中尝试此代码
#include <windows.h>
#include <stdio.h>
void main()
{
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if(!CreateProcessA( NULL, // No module name (use command line)
"C:\\Windows\\notepad.exe", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );