gpt4 book ai didi

c++ - CMD 异常处理 C/C++

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:29 25 4
gpt4 key购买 nike

我将在我的程序中使用一些 CMD 命令,这些命令可能会抛出一些异常。如您所知,当出现异常时,CMD 会将其自己的错误消息写入屏幕。但是,我想编写自己的错误消息。

我的问题是:有没有办法阻止 CMD 消息并只写我自己的错误消息?

附言这不是一个复杂的程序。它使用 System() 执行 CMD 命令。

例子:

比方说,用户可以重命名和复制程序中的任何文件。如您所知,如果用户没有正确输入文件路径,屏幕上会显示一条错误消息。我希望此错误消息永远不会出现在屏幕上。只显示我自己的错误信息。

谢谢!

最佳答案

这取决于您的平台和您要使用的命令。 system() 的用法顺便说一句,大多数人强烈反对调用控制台命令(对于大多数用途来说,这太繁琐了)。
我建议你使用 CreateProcess()使用 CREATE_NO_WINDOW 标志并等待进程通过调用 WaitForSingleObject() 退出和 GetExitCodeProcess() .
这种方法利用了这样一个事实,即大多数 CMD 命令都是可执行文件,位于 C:/Windows/... 中的某处。 .

/*
* Executes a program and returns it's exit code.
*
* TODO: Error checking should be added for
* CreateProcess()
* WaitForSingleObject()
* GetExitCodeProcess()
*/
DWORD ExecCmdLine(TCHAR const* cmdline)
{
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
::CreateProcess(NULL, cmdline, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
::CloseHandle(pi.Thread);
::WaitForSingleObject(pi.hProcess, INFINITE);
DWORD exitcode;
::GetExitCodeProcess(pi.hProcess, &exitcode);
::CloseHandle(pi.hProcess);
return exitcode;
}

如果您想检索命令的输出,您还可以提供 hStdOutput , hStdErrorSTARTUPINFO结构和集合 STARTF_USESTDHANDLESSTARTUPINFO.dwFlags .您甚至可以在执行命令时在自己的程序中执行其他操作(尤其是您提到的文件复制)。这是用 C++ 方式完成的:

/*
* TODO: Error checking should be added for
* CreateProcess()
* WaitForSingleObject()
* GetExitCodeProcess()
*/
class AsyncCmd
{
public:
AsyncCmd(std::string const& cmdline)
: cmdline(cmdline),
processHandle(NULL)
{
}
~AsyncCmd()
{
if (this->processHandle != NULL)
::CloseHandle(this->processHandle);
}
// Starts the execution of the commandline.
void Start(HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE), HANDLE hErr = GetStdHandle(STD_ERROR_HANDLE))
{
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput = hOut;
si.hStdError = hErr;
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(pi));
::CreateProcess(NULL, this->cmdline.c_str(), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
::CloseHandle(pi.hThread);
this->processHandle = pi.hProcess;
}
// Blocks until execution is finished and returns the exit code.
DWORD ExitCode()
{
::WaitForSingleObject(this->processHandle, INFINITE);
DWORD exitcode;
::GetExitCodeProcess(this->processHandle, &exitcode);
return exitcode;
}
private:
AsyncCmd(AsyncCmd const&);
AsyncCmd& operator=(AsyncCmd const&);
std::string cmdline;
HANDLE processHandle;
}

关于c++ - CMD 异常处理 C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com