c++ 调用cmd命令行函数 可隐藏黑框 四种方法总结
在很多情況下,不得不調(diào)用cmd命令行,去實現(xiàn)一系列功能,總結(jié)靠譜方法兩種如下:
方法一:可接受cmd命令行黑框一閃(推薦星數(shù)::可傳值幾乎任何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黑窗?(推薦星數(shù)::可傳值大部分cmd命令,如ipconfig、ping等,具體請自測)
直接調(diào)用此函數(shù)string ExeCmd(string pszCmd)即可,傳命令為string格式,返回值仍為?string格式。
重點:部分命令,傳形參命令時必須加入?cmd.exe /c? 具體請自測。(這個讓我走了好幾天彎路百思不得其解,最后意外發(fā)現(xiàn)此方法可解決,免去了把文件導出來,一行讀取判斷的麻煩!)
例如:改變文件編碼格式命令 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;// 預留字節(jié)數(shù)setlocale(LC_CTYPE, ""); //必須調(diào)用此函數(shù)wchar_t *p = new wchar_t[len];// 申請一段內(nèi)存存放轉(zhuǎn)換后的字符串mbstowcs(p, str.c_str(), len);// 轉(zhuǎn)換std::wstring str1(p);delete[] p;// 釋放申請的內(nèi)存return str1; } string ExeCmd(string pszCmd) {wstring pszCmd_w = Str2Wstr(pszCmd);wcout << "pszCmd_w is " << pszCmd_w << endl;// 創(chuàng)建匿名管道,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);//關(guān)閉管道的輸入端口;// 讀取命令行返回值string strRetTmp;char buff[1024] = { 0 };DWORD dwRead = 0;strRetTmp = buff;while (ReadFile(hRead, buff, 1024, &dwRead, NULL))//從管道的輸出端獲取命令行寫入的數(shù)據(jù);{cout << "buff = " << buff << endl;strRetTmp += buff;}CloseHandle(hRead);//關(guān)閉管道的輸出端口;cout << "strRetTmp:"<<strRetTmp << endl;return strRetTmp; }方法三:調(diào)用vbs腳本,可隱藏黑框(推薦星數(shù):)
vbs腳本:?
Set ws= CreateObject("Wscript.shell")?
ws.run "cmd /c test.bat",vbhide?
另做test.bat填充功能代碼?
方法四:?WinExec函數(shù)(推薦星數(shù):,黑框可隱藏)
? WinExec(cmd.c_str(),SW_HIDE);//cmd(string類型)中為我們要調(diào)用的程序名及其參數(shù), 如 “dir *.exe ”
其第一個參數(shù)相當于system函數(shù)的參數(shù),
其第二個參數(shù)可以設置窗口是否顯示,SW_HIDE這個宏表示隱藏窗口。
重點:部分命令,傳形參命令時也必須加入?cmd.exe /c? 具體請自測。
??? 但是這個函數(shù)有一個問題,函數(shù)創(chuàng)建完這個進程后就返回了,也就是說它返回后,該進程不一定已經(jīng)結(jié)束。
^-^自由 開源因你更精彩^-^ 。
總結(jié)
以上是生活随笔為你收集整理的c++ 调用cmd命令行函数 可隐藏黑框 四种方法总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cmd命令行导出的txt文本文档编码格式
- 下一篇: wstring与string相互转换