標籤:system brief receive 不能 info ring sizeof div read
概述
下面的程式是解決windows 下面調用 system() 函數的時候,會有視窗彈出的問題
標頭檔
#include <windows.h>
源碼
/*** @brief 一般字元轉寬字元** @param lpcszStr 一般字元* @param lpwszStr 轉換後的寬字元* @param dwSize 儲存寬字元的緩衝區大小** @return */BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize){// Get the required size of the buffer that receives the Unicode // string. DWORD dwMinSize;dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);if(dwSize < dwMinSize){return FALSE;}// Convert headers from ASCII to Unicode.MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize); return TRUE;}
/*** @brief 寬字元轉一般字元** @param lpcwszStr 寬字元* @param lpszStr 轉換後的一般字元* @param dwSize 儲存一般字元的緩衝區大小** @return */BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize){DWORD dwMinSize;dwMinSize = WideCharToMultiByte(CP_OEMCP,0,lpcwszStr,-1,NULL,0,NULL,FALSE);if(dwSize < dwMinSize){return FALSE;}WideCharToMultiByte(CP_OEMCP,0,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);return TRUE;}
/*** @brief * WinExec 和 ShellExecute 兩個函數在執行的時候不會等待命令執行完成,* 會造成檔案沒有解壓完就執行完了,不符合我們的需求* ret=WinExec(cmd,SW_HIDE);* ShellExecute((HWND)"open", LPCWSTR(cmd), NULL, NULL,NULL,SW_HIDE); ** system 函數調用可以,但是會有視窗彈出* ret = system(cmd);** 採用下面的方式** @param cmd 這裡面不能出現 > 符號** @return * */int nb_system (char *cmd){wchar_t cmd_w[2048] = {0};MByteToWChar(cmd, cmd_w, sizeof(cmd_w)/sizeof(cmd_w[0]));STARTUPINFO si;ZeroMemory(&si, sizeof(si));si.cb = sizeof STARTUPINFO;PROCESS_INFORMATION pi={0};if(CreateProcess(NULL,cmd_w,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,NULL,NULL,&si,&pi)){//等待進程執行完畢 WaitForSingleObject(pi.hProcess ,INFINITE);//釋放資源CloseHandle(pi.hProcess ); CloseHandle(pi.hThread ); }else{//運行失敗return -1;}return 0;}
測試
int main(){ nb_system("dir");}
windows 下隱藏 system 函數彈窗