windows下C/C++调用命令行不显示执行窗口的方法

来源:互联网 发布:在线视频播放器 mac 编辑:程序博客网 时间:2024/05/16 17:28

1. 问题背景 :  使用dos 命令嵌入在C/C++代码中 ,执行时会显示DOS窗口。

 

2. 嵌入在C/C++代码中的命令行一般有以下几种方式:

SellExcute()

----//调用计算器
----ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL);
----//调用记事本
----ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL)

system()

-----system("dir");

WinExec()

使用方法往下看。

CreateProcess()

使用方法往下看。

参数省略....................................................

3. 解决方案:

 

3.1  使用WinExec()

 

此种方式比较简单易用。

格式:

WinExec(cmd,SW_HIDE);


 

 

3.2 使用CreateProcess()

 

#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) // 设置入口地址#include   <windows.h>   #include   <stdio.h>   #define   COMMENDLINE   "ping 127.0.0.1"//调用命令行命令而不显示命令行窗口BOOL system_hide(char* CommandLine)   {   SECURITY_ATTRIBUTES   sa;   HANDLE   hRead,hWrite;   sa.nLength   =   sizeof(SECURITY_ATTRIBUTES);   sa.lpSecurityDescriptor   =   NULL;   sa.bInheritHandle   =   TRUE;   if   (!CreatePipe(&hRead,&hWrite,&sa,0))    {   return   FALSE;   }     STARTUPINFO   si;   PROCESS_INFORMATION   pi;     si.cb   =   sizeof(STARTUPINFO);   GetStartupInfo(&si);     si.hStdError   =   hWrite;   si.hStdOutput   =   hWrite;   si.wShowWindow   =   SW_HIDE;   si.dwFlags   =   STARTF_USESHOWWINDOW   |   STARTF_USESTDHANDLES;   //关键步骤,CreateProcess函数参数意义请查阅MSDN   if   (!CreateProcess(NULL, CommandLine, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))     {   return   FALSE;   }   CloseHandle(hWrite);   char   buffer[4096]   =   {0};   DWORD   bytesRead;     while(true)     {   memset(buffer,0,strlen(buffer));if(ReadFile(hRead,buffer,4095,&bytesRead,NULL)==NULL)   break;   //buffer中就是执行的结果,可以保存到文本,也可以直接输出   //printf(buffer);//这行注释掉就可以了  Sleep(100);     }     return   TRUE;   }   int main(int argc, char* argv[])   {   system_hide(COMMENDLINE);//不显示命令窗口//system(COMMENDLINE);//显示命令行窗口return 0;   }


 

 

 

 

 

 

原创粉丝点击