c++ - 创建进程和0xc0000142错误

标签 c++ windows createprocess

我有以下测试代码:

#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)+1appName 也是如此。

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

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

char cmdline[] = "op1 op2 op3";

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

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

STARTUPINFO info = { 0 };

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

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

关于c++ - 创建进程和0xc0000142错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9142348/

相关文章:

winapi - 为什么 Unix 有 fork() 而没有 CreateProcess()?

java - JNI(Java) 等同于 INCREF,DECREF 在用于 C++ 的 python 中使用?

c - 有没有办法在 C 中写入 Windows 事件日志?

java - 递归删除目录时的延迟

windows - 如何创建一个不是其创建过程的子进程的过程?

delphi - 在Delphi中使用ShellExecuteEx在同一命令行中运行多个任务

c++ - 在 C++ 中使用 cin 时逗号有什么作用

c++ - BOOST regex - 没有带有回调函数的 u32regex_replace() 原型(prototype)

c++ - 将 libnoise 库链接到 Visual Studio 2010 中的项目时遇到问题

windows - 如何在 Windows 中启用以主目录开头的 Git 终端?