【发布时间】:2021-08-29 07:27:32
【问题描述】:
我正在使用 Visual Studio 2019 社区在 Windows 上工作。我正在用 C++ 编写一个 MFC 应用程序,我正在尝试将以下命令行 txt2pdf -i\".\textfile.txt\" -o\".\pdfout.pdf\" 传递给 cmd。
为此,我使用CreateProcess() 函数,文档是here,this 是一个使用示例。我的代码如下:
void CMFCApplication4Dlg::OnBnClickedButton1()
{
PROCESS_INFORMATION ProcessInfo; //This is what we get as an [out] parameter
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo; //Only compulsory field
LPWSTR cmd_args = (LPWSTR)"txt2pdf.exe - i\".textfile.txt\" -o\".pdfout.pdf\"";
if (!CreateProcess(NULL, cmd_args, NULL, NULL, FALSE, 0, NULL,
NULL, &StartupInfo, &ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
MessageBox(L"Success");
}
else
{
MessageBox(L"The process could not be started...");
}
}
我已经看到很多关于如何调用CreateProcess() 函数的解决方案和示例,我在下面列出了它们,但由于某种原因,它们都不起作用,我总是收到相同的错误消息:
Exception thrown at 0x759FF4BB (KernelBase.dll) in MFCApplication4.exe: 0xC0000005: Access violation writing location 0x00257960.
当我在网上查找时,我没有找到任何与我的代码相关的内容。
我尝试过的其他解决方案:
如何修复我的代码?
【问题讨论】:
-
您似乎不了解您的代码。与你的问题相反,你实际上并没有将任何东西传递给命令处理器(你也不应该)。无论如何,“它不起作用” 不是可操作的问题陈述。请注意,您对
CreateProcess的呼叫是错误的。第二个参数需要是一个指向 non-const 字符串的指针。 -
你观察到的错误是违反documented合约的结果:"
lpCommandLine: [...] 这个函数的Unicode版本,CreateProcessW,可以修改内容此字符串。因此,此参数不能是指向只读内存的指针(如 const 变量或文字字符串)。如果此参数为常量字符串,则函数可能会导致访问冲突。" -
还有很多个问题,比如使用
\t(编码TAB字符),或者依赖当前的工作目录。 -
@IInspectable 谢谢你的评论,我已经更新了代码,但我仍然得到同样的错误。我在传递参数时遇到问题,也许我不完全理解如何使字符串成为非 const 以及如何编码 cmd 所需但在代码中使用时出现问题的
"字符。你有没有机会告诉我如何传递这些参数?谢谢 -
盲目地抛弃 const-ness 并不能解决任何问题。它只是让编译器沉默,欺骗它接受谎言。这仍然是一个谎言,操作系统会让你知道。此外,将
.\t更改为.t并不是您的本意。您应该转义反斜杠,例如.\\t。不过,再一次,依赖当前的工作目录不会成为解决任何问题的易处理的解决方案。如果您想解决访问违规问题,这里已经有很多问答。
标签: c++ visual-studio cmd mfc child-process