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

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

前言

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

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

WinExec

微软文档 WinExec

作用

运行指定应用程序。

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

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

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

  1. 目录的应用程序加载。
  2. 当前目录。
  3. Windows系统目录。
  4. GetSystemDirectory函数检索该目录的路径。
  5. Windows目录。
  6. GetWindowsDirectory函数检索该目录的路径。
  7. 环境变量中列出的目录路径。

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

具体值列表地址

SW_HIDE、SW_NORMAL、SW_SHOWMINIMIZED、SW_SHOWMAXIMIZED等

实例

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

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

注意:

这个函数只提供是为了与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是同步调用进程,调用进程不结束,它就不返回,它可以获取调用进程所返回的值

函数 优点 缺点 隐藏cmd方法 调用后是否阻塞
winExec 1.使用简单 1.老函数 会有调用兼容问题 uCmdShow参数设置为SW_HIDE
System 1.简单易用 需要使用bat命令隐藏
pipopen
ShellExecute 1. 不仅可以运行EXE文件,也可以运行已经关联的文件
CreateProcess 1.使用复杂,功能强大
相关文章
|
12月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
1731 4
|
2月前
|
Ubuntu Unix Linux
在Windows上轻松安装和使用Ubuntu的方法详解
继续点击“Continue”按钮以继续安装流程,随后选择清理磁盘并安装操作系统的选项。 接下来,在安装过程中,你需要选择时区。为了与你的地理位置相匹配,请选择中国上海作为你的时区设置。 在安装过程中,你还需要设置计算机的名称以及账号密码。请务必牢记这些信息,因为它们将作为你登录系统的凭证。
|
3月前
|
Linux Windows
Windows 10/11从官网下载ISO的方法
本文介绍了两种从微软官网下载Windows 10/11 ISO镜像的方法。一是通过修改浏览器User Agent为Linux系统,使官网提供ISO下载链接;二是使用UUPDUMP工具,从官网下载并转换为ISO格式,支持最新开发版,操作简便。
|
17天前
|
运维 iOS开发 Windows
windows电脑备案ios APP获取公钥和证书指纹Sha-1值的方法
在阿里云进行APP备案、在备案IOS端的环节的时候,发现需要我们将p12证书安装在电脑上,再用xcode或或钥匙串访问来获取这个证书的公钥和sha-1值。 但是大部分开发uniapp应用的同学们,或者进行发布的运维人员的电脑都是windows,无法按照阿里云的教程来获取ios的公钥和sha-1。备案就被卡主了。 这里介绍下另一个方法,就是使用香蕉云编来在线上传证书获取。如下图所示,打开香蕉云编后,找到下图这个功能
181 0
|
5月前
|
Web App开发 人工智能 JSON
Windows版来啦!Qwen3+MCPs,用AI自动发布小红书图文/视频笔记!
上一篇用 Qwen3+MCPs实现AI自动发小红书的最佳实践 有超多小伙伴关注,同时也排队在蹲Windows版本的教程。
732 1
|
8月前
|
存储 安全 虚拟化
Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2025 年 2 月更新)
Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2025 年 2 月更新)
322 0
Windows 11 绕过 TPM 方法总结,通用免 TPM 镜像下载 (2025 年 2 月更新)
|
12月前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
305 1
|
10月前
|
存储 缓存 安全
硬盘数据恢复:恢复硬盘数据的9个实用方法(Windows版)
无论是工作文档、家庭照片,还是其他珍贵的数字资产,数据丢失总是一件让人头疼的事情。然而,当硬盘发生问题时,不必过于慌张——只要正确应对,许多数据都可以被成功恢复。本文将从常见数据丢失原因到具体恢复方法,为您提供全面的硬盘数据恢复指导。
|
Windows 数据安全/隐私保护 网络协议
|
16天前
|
运维 安全 网络安全
Windows Server 2019拨号“找不到设备”?Error 1058解决指南
Windows Server 2019拨号报错1058?别急!这不是硬件故障,而是关键服务被禁用。通过“服务依存关系”排查,依次启动“安全套接字隧道协议”“远程接入连接管理”和“路由与远程访问”服务,仅需4步即可恢复PPPoE或VPN拨号功能,轻松解决网络中断问题。
96 1