Createprocess and 0xc0000142 error



我有以下测试代码:

#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;
}

这只是一个在windows中创建进程的测试代码。问题是,当我启动"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;
}

那么,有什么想法吗?

最明显的是,char cmdLine2[sizeof(CMDLINE)];声明了一个长度等于机器指针大小的字符串。您需要使用strlen(CMDLINE)+1。对于CCD_ 3也是如此。

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

至于lpCommandLine,它确实需要是可写的,最简单的做法是这样做:

char cmdline[] = "op1 op2 op3";

这为您提供了一个可写缓冲区。请注意,您不需要重复可执行文件名。

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

STARTUPINFO info = { 0 };

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

您可以也应该为lpProcessAttributeslpThreadAttributes参数传递NULL

这个答案是为了说明0xc0000142的另一个原因——放在这里(尽管这个问题接受了另一个答案),因为关于这个错误的管道之间几乎没有有用的信息——以及令人震惊的缺乏微软关于这个主题的任何有用信息——所以某人的互联网搜索可能会把它们放在这里。(嗯,我的的确如此。)

因此:在启动用C++编写的进程时,您可以获得The application was unable to start correctly (0xc0000142),在该进程中,您可以通过静态对象的构造函数中的空指针进行访问。(在我的例子中,它是在静态对象的构造函数的初始化器中。)

您对此的提示将是应用程序日志中的一个事件(事件id 1000源"应用程序错误"),其行类似于以下内容:

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

当然,0xc0000005是访问违规,偏移量为0(实际上,任何小于0x10000的值都是通过空指针的引用

无论如何,(对我来说)令人惊讶的是,在调试器可以附加(!!)之前就开始计算statics了,所以使用ImageFileExecutionOptions集甚至直接在Visual Studio中启动它都不能调试这件事!!

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

最新更新