• 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 函数,该函数对 > 符号不支持,所以命令中的 > 符号相关的处理会不执行

  • 相关阅读:
    flush privileges 什么意思
    kill
    xargs
    mysql 5.6 与5.7安装
    内核线程、轻量级进程、用户线程
    在gdb将所有线程的堆栈输出到文件中去
    GDB 反向调试(Reverse Debugging)
    redhat 6.6 安装 (LVM)
    GDB中创建要素数据集
    AO Identify地图交互
  • 原文地址:https://www.cnblogs.com/etangyushan/p/6826311.html
Copyright © 2020-2023  润新知