【问题标题】:Createprocess and 0xc0000142 errorCreateprocess 和 0xc0000142 错误
【发布时间】:2026-01-08 03:00:02
【问题描述】:

我有以下测试代码:

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

那么,有什么想法吗?

【问题讨论】:

标签: c++ windows createprocess


【解决方案1】:

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

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

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

char cmdline[] = "op1 op2 op3";

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

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

STARTUPINFO info = { 0 };

对您传递的所有结构执行此操作。

您可以并且应该将NULL 传递给lpProcessAttributeslpThreadAttributes 参数。

【讨论】:

    【解决方案2】:

    这个答案是与0xc0000142 的另一个原因相关 - 放在这里(即使这个问题接受了另一个答案),因为关于这个错误的 intertubes 的有用信息非常少 - 并且令人震惊 缺乏 任何 来自 Microsoft 的关于该主题的有用信息 - 因此某人的 Internet 搜索可能会在此处找到它们。 (嗯,我的。)

    所以:您可以在启动用 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 的任何东西都是通过空指针的引用。

    无论如何,(对我而言)令人惊讶的是,评估静态变量发生在 调试器可以附加 (!!) 因此使用 ImageFileExecutionOptions 设置甚至直接在 Visual Studio 中启动它都不会让你调试这个东西!!

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

    【讨论】: