[笔记]Windows核心编程《番外篇》几种常见的执行命令行方法

简介: Windows核心编程《番外篇》几种常见的执行命令行方法

文章目录



前言


几种常见的执行命令行方法:

  • winExec函数
  • CreateProcess函数
  • System函数
  • pipopen管道函数
  • ShellExecute函数


WinExec


微软文档 WinExec

作用

运行指定应用程序。

UINT WinExec(
  [in] LPCSTR lpCmdLine,
  [in] UINT   uCmdShow
);

lpCmdLine:命令行(文件名+可选参数)为应用程序执行。

如果没有包含文件路径将会从以下目录按顺序搜索:


   目录的应用程序加载。

   当前目录。

   Windows系统目录。

   GetSystemDirectory函数检索该目录的路径。

   Windows目录。

   GetWindowsDirectory函数检索该目录的路径。

   环境变量中列出的目录路径。


uCmdShow:显示选项。可接受的值的列表,请参阅nCmdShow的描述参数的显示窗口函数。

具体值列表地址

SW_HIDE、SW_NORMAL、SW_SHOWMINIMIZED、SW_SHOWMAXIMIZED等


实例

隐藏控制台弹窗 执行vb弹窗脚本

WinExec("mshta vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)"


注意:

这个函数只提供是为了与16位Windows兼容。

应用程序应该使用CreateProcess函数。


CreateProcess



作用


实例

  LPCSTR lpCmdLine = "mshta vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)";
  UINT uCmdShow = 0;
  PROCESS_INFORMATION pi;
  STARTUPINFO si;
  // 建立新进程
  ZeroMemory(&si, sizeof(STARTUPINFO));
  BOOL b = CreateProcess(NULL, const_cast<LPTSTR>(lpCmdLine), NULL,NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
  if (!b) {
    return FALSE;
  }
  // 阻塞调用者线程
  WaitForSingleObject(pi.hProcess, INFINITE);
  return TRUE;


System


System C++自带的 会阻塞


popen


微软文档

// crt_popen.c
/* This program uses _popen and _pclose to receive a
* stream of text from a system process.
*/
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
   char   psBuffer[128];
   FILE   *pPipe;
        /* Run DIR so that it writes its output to a pipe. Open this
         * pipe with read text attribute so that we can read it
         * like a text file.
         */
   if( (pPipe = _popen( "dir *.c /on /p", "rt" )) == NULL )
      exit( 1 );
   /* Read pipe until end of file, or an error occurs. */
   while(fgets(psBuffer, 128, pPipe))
   {
      puts(psBuffer);
   }
   /* Close pipe and print return value of pPipe. */
   if (feof( pPipe))
   {
     printf( "\nProcess returned %d\n", _pclose( pPipe ) );
   }
   else
   {
     printf( "Error: Failed to read the pipe to the end.\n");
   }
}


ShellExecute


ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。


ShellExecute

ShellExecute(NULL, "mshta", "vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)", NULL, NULL, SW_SHOW);


ShellExecuteEx

管理员权限运行命令

  SHELLEXECUTEINFO shExecInfo;
  shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
  shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
  shExecInfo.hwnd = NULL;
  shExecInfo.lpVerb = L"runas";
  shExecInfo.lpFile = L"mshta.exe";
  shExecInfo.lpDirectory = L"";
  shExecInfo.lpParameters = L"vbscript:msgbox(\"提示内容\",64,\"提示框Title\")(window.close)";
  shExecInfo.lpClass = NULL;
  shExecInfo.nShow = SW_HIDE;
  shExecInfo.hInstApp = NULL;
  DWORD err = ERROR_SUCCESS;
  if (!ShellExecuteEx(&shExecInfo)) {
    return GetLastError();
  }


区别比较


c++ system()和WinExec()的区别

https://blog.csdn.net/qq_26591517/article/details/80513985

1.CreateProcess因为使用复杂,比较少用。

2.WinExec主要运行EXE文件。如:WinExec(‘Notepad.exe Readme.txt’, SW_SHOW);

3.ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。


winExec是不同步的进程调用,就是调用起来了就返回了,不会等调用起来的程序结束

system是同步调用进程,调用进程不结束,它就不返回,它可以获取调用进程所返回的值


图片.png

相关文章
|
6天前
|
编解码 Windows
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
XviD是开源MPEG-4视频编码器,与DivX相似但后者非开源。早期MP4常使用XviD或DivX编码,现已被H.264取代。在Windows上集成FFmpeg的XviD编解码库libxvid,需访问<https://labs.xvid.com/source/>下载源码,解压后在MSYS环境中配置、编译和安装。之后重新配置FFmpeg,启用libxvid并编译安装。详细步骤包括configure命令、make和make install。成功后,通过`ffmpeg -version`检查是否启用libxvid。更多音视频开发技术可参考《FFmpeg开发实战:从零基础到短视频上线》。
35 0
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
|
1月前
|
算法 Linux Windows
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
在Windows环境下为FFmpeg集成字幕渲染库libass涉及多个步骤,包括安装freetype、libxml2、gperf、fontconfig、fribidi、harfbuzz和libass。每个库的安装都需要下载源码、配置、编译和安装,并更新PKG_CONFIG_PATH环境变量。最后,重新配置并编译FFmpeg以启用libass及相关依赖。完成上述步骤后,通过`ffmpeg -version`确认libass已成功集成。
46 1
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
|
1月前
|
缓存 网络协议 Linux
碎片技能:在 Windows 的任意目录一键快捷进入 CMD 命令行界面
在Windows 10/11中,SaaS服务商常需使用命令行,如PowerShell或CMD。本文介绍了如何进入DOS命令行:通过“开始”菜单→“运行”→输入“cmd”,然后确认。此外,还展示了如何在任意目录快速启动DOS命令行,只需右键点击并选择相应菜单项。提供两种实现方法:一是导入注册表文件,二是使用名为ContextMenuManager的优化软件。建议使用软件方法,易于添加和删除菜单项。
29 1
碎片技能:在 Windows 的任意目录一键快捷进入 CMD 命令行界面
|
27天前
|
编解码 5G Linux
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
AVS3是中国首个8K及5G视频编码标准,相比AVS2和HEVC性能提升约30%。解码器libuavs3d支持8K/60P视频实时解码,兼容多种平台。《FFmpeg开发实战》书中介绍了在Windows环境下如何集成libuavs3d到FFmpeg。集成步骤包括下载源码、使用Visual Studio 2022编译、调整配置、安装库文件和头文件,以及重新配置和编译FFmpeg以启用libuavs3d。
41 0
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
|
9天前
|
Windows
|
1月前
|
编解码 Linux Windows
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
在Windows环境下,为FFmpeg集成音频编解码库,包括libogg、libvorbis和opencore-amr,涉及下载源码、配置、编译和安装步骤。首先,安装libogg,通过配置、make和make install命令完成,并更新PKG_CONFIG_PATH。接着,安装libvorbis,同样配置、编译和安装,并修改pkgconfig文件。之后,安装opencore-amr。最后,重新配置并编译FFmpeg,启用ogg和amr支持,通过ffmpeg -version检查是否成功。整个过程需确保环境变量设置正确,并根据路径添加相应库。
47 1
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
|
1月前
|
网络协议 Windows
电脑ip在哪里查看?windows系统查看ip地址的8种方法
在Windows系统中,有多种方法可以查看电脑的IP地址。
232 2
|
1月前
|
Linux 编译器 C语言
FFmpeg开发笔记(二)搭建Windows系统的开发环境
在Windows上学习FFmpeg通常较困难,但通过安装预编译的FFmpeg开发包可以简化流程。首先需要安装MSYS2来模拟Linux环境。下载并执行MSYS2安装包,然后修改msys2_shell.cmd以继承Windows的Path变量。使用pacman安装必要的编译工具。接着,下载预编译的FFmpeg Windows包,解压并配置系统Path。最后,在MSYS2环境中运行`ffmpeg -version`确认安装成功。欲深入学习FFmpeg开发,推荐阅读《FFmpeg开发实战:从零基础到短视频上线》。
51 4
FFmpeg开发笔记(二)搭建Windows系统的开发环境
|
1月前
|
编解码 Linux Windows
FFmpeg开发笔记(十三)Windows环境给FFmpeg集成libopus和libvpx
本文档介绍了在Windows环境下如何为FFmpeg集成libopus和libvpx库。首先,详细阐述了安装libopus的步骤,包括下载源码、配置、编译和安装,并更新环境变量。接着,同样详细说明了libvpx的安装过程,注意需启用--enable-pic选项以避免编译错误。最后,介绍了重新配置并编译FFmpeg以启用这两个库,通过`ffmpeg -version`检查是否成功集成。整个过程参照了《FFmpeg开发实战:从零基础到短视频上线》一书的相关章节。
64 0
FFmpeg开发笔记(十三)Windows环境给FFmpeg集成libopus和libvpx
|
1月前
|
Windows
Windows 程序自启动实现方法详解
Windows 程序自启动实现方法详解
43 0