2012-02-04 89 views
3

我有以下的测试代码:的CreateProcess和0xc0000142错误

#define CMDLINE ".\\dummyFolder\\dummyProc.exe op1 op2 op3" 

int main(int argc, char **argv) { 

STARTUPINFO info; 
info.cb = sizeof(STARTUPINFO); 
info.lpReserved = NULL; 
info.cbReserved2 = 0; 
info.lpReserved2 = NULL; 

PROCESS_INFORMATION processInfo; 

SECURITY_ATTRIBUTES procAttr; 
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
procAttr.lpSecurityDescriptor = NULL; 
procAttr.bInheritHandle = false; 

SECURITY_ATTRIBUTES threadAttr; 
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
procAttr.lpSecurityDescriptor = NULL; 
procAttr.bInheritHandle = false; 

bool handlersInheritable = true; 

char cmdLine2[sizeof(CMDLINE)]; 
strcpy(cmdLine2, CMDLINE); 

char AppName[sizeof(".\\dummyFolder\\dummyProc.exe")]; 
strcpy(AppName, ".\\dummyFolder\\dummyProc.exe"); 


if (CreateProcess(AppName, cmdLine2, &procAttr, &threadAttr, 
     handlersInheritable, 0, NULL, NULL, &info, &processInfo)) { 

    //::WaitForMultipleObjects(procQty, handlers, waitForAll, waitInterval); 
    CloseHandle(processInfo.hProcess); 
    CloseHandle(processInfo.hThread); 
    CloseHandle(info.hStdError); 
    CloseHandle(info.hStdInput); 
    CloseHandle(info.hStdOutput); 
} else { 
    std::cout << "Returned: " << GetLastError() << std::endl; 
} 

std::cout << "Exiting main process" << std::endl; 

return 0; 
} 

这仅仅是在窗口创建过程中的测试代码。问题是,当我启动“dummyProc.exe”我得到一个0xc0000142错误。

dummyProc.exe过程可以在命令行中正常运行,但不能在代码中运行。

这里的dummyProc码,如果有帮助:

int main(int argc, char **argv) { 


std::cout << "Working!!!!" << std::endl << "Receivedi: " << std::endl; 

for (int i = 0; i < argc; ++i) 
    std::cout << argv[i] << std::endl; 


return 0; 
} 

因此,任何想法?

+0

见http://support.microsoft.com/kb/960266 – 2012-02-04 16:28:48

回答

3

char cmdLine2[sizeof(CMDLINE)];声明一个等于您机器指针大小的长度字符串最明显的东西。您需要改用strlen(CMDLINE)+1。同样适用于appName

请注意,CreateProcess的第一个参数不需要可写。只需将字符串直接传递给它即可。不需要appName变量。

至于lpCommandLine这确实需要写的最简单的方法做到这一点是这样的:

char cmdline[] = "op1 op2 op3"; 

这就给了你可写缓冲区。请注意,您不需要重复执行文件名称。

另一个问题是您尚未将所有参数初始化为CreateProcess。例如,STARTUPINFO结构体有19个字段,并且只初始化为3.您应该将所有结构体初始化为0,然后填写需要为非零的任何字段。像这样:

STARTUPINFO info = { 0 }; 

对所有通过的结构都这样做。

您可以并应该通过NULL获取lpProcessAttributeslpThreadAttributes的参数。

+0

这个工作。非常感谢! – ExusTheOne 2012-02-04 16:35:01

0

这个答案是涉及另一个原因0xc0000142 - 放在这里,因为没有关于此错误的intertubes很少有用的信息(即使另一个答案被接受了这个问题) - 和一个令人震惊的缺乏任何有关微软主题的有用信息 - 所以某人的互联网搜索可能会让他们在这里。 (嗯,我的确如此。)

所以:你可以得到The application was unable to start correctly (0xc0000142)开始一个用C++编写的进程,你可以在静态对象的构造函数中访问一个空指针。 (在我的情况下,它是在一个静态对象的构造函数的初始化程序中)。

您对此的提示将是应用程序日志中的事件(事件ID 1000源“应用程序错误”),它具有类似于以下:

Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000 
Exception code: 0xc0000005 
Fault offset: 0x0000000000000000 

0xc0000005是访问冲突,当然,和0(实际上任何小于0x10000偏移量是通过一个空指针的引用。

无论如何,令人吃惊的事情(我)是评估静发生前的调试器可以连接(!!),所以使用Visual Studio中ImageFileExecutionOptions集,甚至直接启动它不会让你调试这个东西! !

(然后当然,你不会找到任何微软的文档在任何0xc0000142。干得好,NT团队!)

相关问题