c++ 调用cmd命令行函数 可隐藏黑框 四种方法总结
在很多情况下,不得不调用cmd命令行,去实现一系列功能,总结靠谱方法两种如下:
方法一:可接受cmd命令行黑框一闪(推荐星数::可传值几乎任何cmd命令)
string
string getCmdResult(const string &strCmd)//传参string格式命令,返回值string格式; {char buf[10240] = { 0 };FILE *pf = NULL;if ((pf = _popen(strCmd.c_str(), "r")) == NULL){return "";}string strResult;while (fgets(buf, sizeof buf, pf)){strResult += buf;}_pclose(pf);unsigned int iSize = strResult.size();if (iSize > 0 && strResult[iSize - 1] == '\n') {strResult = strResult.substr(0, iSize - 1);}return strResult; }方法二:隐藏CMD黑窗 (推荐星数::可传值大部分cmd命令,如ipconfig、ping等,具体请自测)
直接调用此函数string ExeCmd(string pszCmd)即可,传命令为string格式,返回值仍为 string格式。
重点:部分命令,传形参命令时必须加入 cmd.exe /c 具体请自测。(这个让我走了好几天弯路百思不得其解,最后意外发现此方法可解决,免去了把文件导出来,一行读取判断的麻烦!)
例如:改变文件编码格式命令 type 1.txt>2.txt
传形参时应该这样传参 cmd.exe /c type 1.txt>2.txt
#include <iostream>#include <string> //#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//隐藏命令行 #include <windows.h> #include <stdio.h> #include <tchar.h> using namespace std; wstring Str2Wstr(string str) {unsigned len = str.size() * 2;// 预留字节数setlocale(LC_CTYPE, ""); //必须调用此函数wchar_t *p = new wchar_t[len];// 申请一段内存存放转换后的字符串mbstowcs(p, str.c_str(), len);// 转换std::wstring str1(p);delete[] p;// 释放申请的内存return str1; } string ExeCmd(string pszCmd) {wstring pszCmd_w = Str2Wstr(pszCmd);wcout << "pszCmd_w is " << pszCmd_w << endl;// 创建匿名管道,write->read;SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };HANDLE hRead, hWrite;if (!CreatePipe(&hRead, &hWrite, &sa, 0)){cout << "@ CreatePipe failed!" << endl;return (" ");}cout << "@0" << endl;// 设置命令行进程启动信息(以隐藏方式启动命令并定位其输出到hWriteSTARTUPINFO si = { sizeof(STARTUPINFO) }; // Pointer to STARTUPINFO structure;GetStartupInfo(&si);si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;//si.dwFlags = STARTF_USESHOWWINDOW;si.wShowWindow = SW_HIDE; //隐藏窗口;si.hStdError = hWrite;si.hStdError = hWrite;si.hStdOutput = hWrite; //管道的输入端口连接命令行的输出;// 启动命令行PROCESS_INFORMATION pi;// Pointer to PROCESS_INFORMATION structure;if (!CreateProcess(NULL,(LPWSTR)pszCmd_w.c_str(),NULL,NULL,TRUE, //FALSE, // Set handle inheritance to FALSENULL,//0, // No creation flagsNULL,NULL,&si,&pi)){cout << "@ CreateProcess failed!" << endl;return ("Cannot create process");}CloseHandle(hWrite);//关闭管道的输入端口;// 读取命令行返回值string strRetTmp;char buff[1024] = { 0 };DWORD dwRead = 0;strRetTmp = buff;while (ReadFile(hRead, buff, 1024, &dwRead, NULL))//从管道的输出端获取命令行写入的数据;{cout << "buff = " << buff << endl;strRetTmp += buff;}CloseHandle(hRead);//关闭管道的输出端口;cout << "strRetTmp:"<<strRetTmp << endl;return strRetTmp; }方法三:调用vbs脚本,可隐藏黑框(推荐星数:)
vbs脚本:
Set ws= CreateObject("Wscript.shell")
ws.run "cmd /c test.bat",vbhide
另做test.bat填充功能代码
方法四: WinExec函数(推荐星数:,黑框可隐藏)
WinExec(cmd.c_str(),SW_HIDE);//cmd(string类型)中为我们要调用的程序名及其参数, 如 “dir *.exe ”
其第一个参数相当于system函数的参数,
其第二个参数可以设置窗口是否显示,SW_HIDE这个宏表示隐藏窗口。
重点:部分命令,传形参命令时也必须加入 cmd.exe /c 具体请自测。
但是这个函数有一个问题,函数创建完这个进程后就返回了,也就是说它返回后,该进程不一定已经结束。
^-^自由 开源因你更精彩^-^ 。
总结
以上是生活随笔为你收集整理的c++ 调用cmd命令行函数 可隐藏黑框 四种方法总结的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: cmd命令行导出的txt文本文档编码格式
- 下一篇: QT 托盘图标退出延迟解决方案