windows 下隐藏 system 函数弹窗
概述
下面的程序是解决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"); }
注意
本示例中使用的是 CreateProcess 函数,该函数对 > 符号不支持,所以命令中的 > 符号相关的处理会不执行