概述

下面的程序是解决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, , lpcszStr, -, NULL, ); if(dwSize < dwMinSize)
{
return FALSE;
} // Convert headers from ASCII to Unicode.
MultiByteToWideChar (CP_ACP, , lpcszStr, -, 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,,lpcwszStr,-,NULL,,NULL,FALSE);
if(dwSize < dwMinSize)
{
return FALSE;
}
WideCharToMultiByte(CP_OEMCP,,lpcwszStr,-,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[] = {};
MByteToWChar(cmd, cmd_w, sizeof(cmd_w)/sizeof(cmd_w[]));
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof STARTUPINFO; PROCESS_INFORMATION pi={};
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 -;
} return ;
}

测试

int main()

{
nb_system("dir");
}

注意

本示例中使用的是 CreateProcess 函数,该函数对 > 符号不支持,所以命令中的 > 符号相关的处理会不执行

windows 下隐藏 system 函数弹窗的更多相关文章

  1. 【C/C++】Linux下使用system()函数一定要谨慎

    [C/C++]Linux下使用system()函数一定要谨慎 http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为 ...

  2. windows下隐藏磁盘分区

    在一定情况下有的人会想隐藏掉部分分区,比如双系统的情况 有两种方式 方法1: 删除盘符,适合在双系统的情况下隐藏掉另外一个系统相关的分区 请注意是删除盘符 不是删除分区 此电脑右键管理 点击磁盘管理 ...

  3. windows下隐藏磁盘分区(转)

    在一定情况下有的人会想隐藏掉部分分区,比如双系统的情况 有两种方式 方法1: 删除盘符,适合在双系统的情况下隐藏掉另外一个系统相关的分区 请注意是删除盘符 不是删除分区 此电脑右键管理 点击磁盘管理 ...

  4. Linux下使用system()函数一定要谨慎

    转载自:http://my.oschina.net/renhc/blog/53580   linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对syste ...

  5. [转]【C/C++】Linux下使用system()函数一定要谨慎

    曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...

  6. (转)Linux下使用system()函数一定要谨慎

    转:http://my.oschina.net/renhc/blog/53580 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函 ...

  7. Windows下绘制数学函数图像的方法

    一.安装相关软件 在Windows中安装VirtualBox: 在VirtualBox中安装Ubuntu Server: 在Ubuntu Server中安装cifs-utils:sudo apt-ge ...

  8. windows下使用gethostbyname函数报错无法解析的外部符号

    #include <winsock.h> 使用gethostbyname的函数的时候,会显示无法解析的外部符号. 主要问题是因为没有引用WS2_32的lib库 在include上面引用就行 ...

  9. c/c++中system函数在Linux和windows下区别

    windows 在windows下的system函数中命令可以不区别大小写! 功 能: 发出一个DOS命令 #include <stdlib.h> int system(char *com ...

随机推荐

  1. Spring层面的事务管理

    事务管理方式 1. 编程式事务管理 2. 声明式事务管理 建立于AOP之上,对指定的方法执行前后进行拦截,即在方法执行前开始或加入一个事务,执行完毕后根据结果提交或回滚事务. 方式: a. 配置文件中 ...

  2. 双向链表(C++实现)

    ////////////////////////////////////////////////////////////////////////////////////// /////// 这里建立两 ...

  3. my.cnf重要配置参数说明

    不同存储引擎中关键参数优化 MyISAM存储引擎 MyISAM存储引擎适用于读多写少,对读性能要求比较高的系统 官方文档:http://dev.mysql.com/doc/refman/5.6/en/ ...

  4. Symbol Table(符号表)

    一.定义 符号表是一种存储键值对的数据结构并且支持两种操作:将新的键值对插入符号表中(insert):根据给定的键值查找对应的值(search). 二.API 1.无序符号表 几个设计决策: A.泛型 ...

  5. CentOS下查看文件和文件夹大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. 当磁盘大小超过标准时会有报警提示,这时如 ...

  6. Html 表单表格 form table

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. hdoj1001--Sum Problem

    Problem Description Hey, welcome to HDOJ(Hangzhou Dianzi University Online Judge).In this problem, y ...

  8. Android Studio Mac版快捷键

    mac上按键符号 ⌥ : option / alt ⇧ : shift ⌃ : control ⌘ : command ⎋ : esc (一)查找/查看相关 搜索任意内容 双击 sft 当前文件查找/ ...

  9. node.js+express+jade系列五:ajax登录

    本文通过jquery实现简单的无刷新登录 1:首先要在router中配置登录请求,因为登录需要传user和pwd考虑到安全需用post请求 {        path:'/',        meth ...

  10. python3与Redis连接操作

    Python3之redis使用   简介 redis是一个key-value存储系统,和Memcache类似,它支持存储的value类型相对更多,包括string(字符串),list(链表),set( ...