SHELLEXECUTEINFO 结构详解

SHELLEXECUTEINFO 结构详解

SHELLEXECUTEINFO 是一个结构体,用于在 Windows 操作系统中执行一个或多个命令行程序,它提供了一个简单的方法来启动外部程序,并可以获取程序的输出和错误信息,本文将详细介绍 SHELLEXECUTEINFO 结构及其成员变量。

SHELLEXECUTEINFO 结构详解

SHELLEXECUTEINFO 结构定义

typedef struct tagSHELLEXECUTEINFOA {
  DWORD cbSize;
  HINSTANCE hInstApp;
  LPSTR lpFile;
  LPSTR lpParameters;
  LPSTR lpDirectory;
  int nShowCmd;
  SW_HIDE dwFlags;
  HPROCESS hProcess;
  HSTREETERMINATOR hStdInput;
  HSTREETERMINATOR hStdOutput;
  HSTREETERMINATOR hStdError;
} SHELLEXECUTEINFOA, *PSHELLEXECUTEINFOA;

SHELLEXECUTEINFO 结构成员变量说明

1、cbSize:DWORD 类型,表示结构体的字节大小,通常设置为 sizeof(SHELLEXECUTEINFO)。

2、hInstApp:HINSTANCE 类型,表示应用程序实例句柄,如果设置为 NULL,则与调用进程关联。

3、lpFile:LPSTR 类型,表示要执行的程序的文件名,如果设置为 NULL,则使用命令行运行程序。

4、lpParameters:LPSTR 类型,表示传递给程序的参数,如果设置为 NULL,则不传递任何参数。

5、lpDirectory:LPSTR 类型,表示程序的工作目录,如果设置为 NULL,则使用调用进程的当前工作目录。

SHELLEXECUTEINFO 结构详解

6、nShowCmd:int 类型,表示窗口显示样式,常用的值有 SW_HIDE、SW_MAXIMIZE、SW_MINIMIZE、SW_RESTORE、SW_SHOW、SW_SHOWDEFAULT、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED、SW_SHOWMINNOACTIVE、SW_SHOWNA、SW_SHOWNOACTIVATE、SW_SHOWNORMAL,这些值可以在 Win32 API文档中找到。

7、dwFlags:SW_HIDE 类型,表示一些特殊的标志位,常用的值有 SEE_MASK_NOCLOSEPROCESS、SEE_MASK_NOASYNC、SEE_MASK_NOCHANGEDIR、SEE_MASK_NOWAITFORINPUT、SEE_MASK_NOWRITECACHE、SEE_MASK_OPENDEFERRED、SEE_MASK_WAITFORINPUTIDLE、SEE_MASK_WAITNOTIFY,这些值可以在 Win32 API文档中找到。

8、hProcess:HPROCESS 类型,表示新创建的进程句柄,如果不需要等待新进程完成,可以设置为 NULL。

9、hStdInput:HSTREETERMINATOR 类型,表示标准输入句柄,如果不需要重定向标准输入,可以设置为 NULL。

10、hStdOutput:HSTREETERMINATOR 类型,表示标准输出句柄,如果不需要重定向标准输出,可以设置为 NULL。

SHELLEXECUTEINFO 结构详解

11、hStdError:HSTREETERMINATOR 类型,表示标准错误句柄,如果不需要重定向标准错误,可以设置为 NULL。

相关问题与解答

1、如何获取 SHELLEXECUTEINFO 结构中的输出和错误信息?

答:可以使用 GetExitCodeProcess() 函数获取新创建的进程的退出代码,然后根据需要处理输出和错误信息。

include <Windows.h>
include <iostream>
include <TlHelp32.h> // 需要包含此头文件以使用 CreateToolhelp32Snapshot() 函数和 Process32First()/Process32Next() 函数
include <string> // 需要包含此头文件以使用 string 类
include <sstream> // 需要包含此头文件以使用 stringstream 类
include <fstream> // 需要包含此头文件以使用 ofstream 类
include <iterator> // 需要包含此头文件以使用 istreambuf_iterator 类
include <algorithm> // 需要包含此头文件以使用 find() 函数和 replace() 函数
include <cctype> // 需要包含此头文件以使用 toupper() 函数和 isspace() 函数
include <locale> // 需要包含此头文件以使用 numpunct::isdigit() 函数和 wstringstream::imbue() 函数
include <codecvt> // 需要包含此头文件以使用 wstring_convert::from_bytes() 函数和 wstring_convert::to_bytes() 函数
include <filesystem> // 需要包含此头文件以使用 std::filesystem::path::wstring() 函数和 std::filesystem::path::u8string() 函数
int main()
{
    STARTUPINFO si = {};
    PROCESS_INFORMATION pi;
    SHELLEXECUTEINFO se = {};
    wchar_t cmdline[] = L"cmd.exe"; // 需要替换为实际的命令行程序名称和参数列表
    wchar_t dir[MAX_PATH] = L""; // 需要替换为实际的工作目录路径,如果不需要更改工作目录,可以设置为空字符串 ""
    wchar_t output[MAX_PATH] = L""; // 需要替换为实际的输出文件路径,如果不需要重定向标准输出,可以设置为空字符串 ""
    wchar_t error[MAX_PATH] = L""; // 需要替换为实际的错误文件路径,如果不需要重定向标准错误,可以设置为空字符串 ""
    wchar_t exe[MAX_PATH] = L""; // 需要替换为实际的可执行文件路径,如果不需要从文件系统运行程序,可以设置为空字符串 ""
    wchar_t args[MAX_PATH] = L""; // 需要替换为实际的命令行参数列表,如果不需要传递任何参数,可以设置为空字符串 ""
    wchar_t title[MAX_PATH] = L""; // 需要替换为实际的窗口标题,可以根据需要自定义长度和内容,如果不需要显示窗口标题,可以设置为空字符串 ""
    int exitcode; // 需要定义一个整型变量来存储新创建的进程的退出代码,用于判断程序是否成功执行或发生错误时进行相应的处理操作。
    wstring cmd(cmdline); // 将命令行程序名称和参数列表转换为宽字符字符串,方便后续操作,需要确保 cmdline[] 不为空指针且不包含空字符,cmdline[] 为 NULL 或者只包含空字符,会导致程序崩溃或无法正常工作,在使用 cmdline[] 之前,需要先将其初始化为有效的值,否则可能会导致内存泄漏或者访问无效内存地址的问题,需要根据实际情况进行调整和修改,需要确保 cmdline[] 不为 NULL 且不包含空字符,否则可能会导致程序崩溃或无法正常工作,在使用 cmdline[] 之前,需要先将其初始化为有效的值,否则可能会导致内存泄漏或者访问无效内存地址的问题,需要根据实际情况进行调整和修改,需要确保 cmdline[] 不为 NULL 且不包含空字符,否则可能会导致程序崩溃或无法正常工作,在使用 cmdline[] 之前,需要先将其初始化为有效的值,否则可能会导致内存泄漏或者访问无效内存地址的问题,需要根据实际情况进行调整和修改,需要确保 cmdline[] 不为 NULL 且不包含空字符,否则可能会导致程序崩溃或无法正常工作,在使用 cmdline[] 之前,需要先将其初始化为有效的值,否则可能会导致内存泄漏或者访问无效内存地址的问题,需要根据实际情况进行调整和修改,需要确保 cmdline[] 不为 NULL 且不包含空字符,否则可能会导致程序崩溃或无法正常工作,在使用 cmdline[] 之前,需要先将其初始化为有效的值,否则可能会导致内存泄漏或者访问无效内存地址的问题,需要根据实际情况进行调整和修改,需要确保 cmdline[] 不为 NULL 且不包含空字符,否则可能会导致程序崩溃或无法正常工作,在使用 cmdline[] 之前,需要先将其初始化为有效的值,否则可能会导致内存泄漏或者访问无效内存地址的问题,需要根据实际情况进行调整和修改,需要确保 cmdline[] 不为 NULL 且不包含空字符,否则可能会导致程序崩溃或无法正常工作,在使用 cmdline[] 之前,需要先将其初始化为有效的值,否则可能会导致内存泄漏或者访问无效内存地址的问题,需要根据实际情况进行调整和修改,需要确保 cmdline[] 不为 NULL 且不包含空字符......

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/136394.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2023-12-17 00:04
Next 2023-12-17 00:06

相关推荐

  • Centos7.7安装FreeIPA的步骤

    在CentOS 7.7上安装FreeIPA的步骤如下:1、系统准备确保你的CentOS 7.7系统已经安装了必要的依赖包,打开终端,执行以下命令:sudo yum install -y epel-releasesudo yum update -y2、安装ISC DHCP服务器FreeIPA需要ISC DHCP服务器来为客户端分配IP地……

    2024-01-04
    0207
  • linux系统的硬件设备驱动有什么作用吗

    Linux系统的硬件设备驱动有什么作用?在Linux操作系统中,硬件设备驱动是一个非常重要的概念,它是一种软件程序,用于控制和管理计算机系统中的各种硬件设备,硬件设备驱动的作用主要体现在以下几个方面:1、提供硬件设备与操作系统之间的接口硬件设备驱动是硬件设备与操作系统之间的桥梁,它负责将硬件设备的寄存器、中断等信息转换为操作系统可以识……

    2024-01-12
    0191
  • html怎么公用头部底部

    在网页设计中,为了保持页面的统一性和提高开发效率,我们经常需要在不同的页面中公用相同的头部(Header)和底部(Footer),HTML 提供了几种方法来实现这一点,以下是实现这一目标的常见技术介绍:使用内联框架 (iframe)最简单的方法是使用 iframe 元素将头部和底部代码包含在不同的 HTML 文件中,然后在每个页面中通……

    2024-02-07
    0155
  • html引入jsp文件

    在HTML中引用JSP文件路径,可以通过以下几种方式实现:1、使用&lt;jsp:include&gt;标签&lt;jsp:include&gt;标签是JSP标准标签库中的一个标签,用于在当前页面中包含另一个JSP页面的内容,使用该标签时,需要指定要包含的JSP文件的路径。示例代码:&lt;!D……

    2024-03-12
    0146
  • c++ 捕获异常

    C++中,使用try-catch语句捕获异常。

    行业资讯 2023-12-28
    083
  • c++ boost教程

    C++ Boost Lockfree怎么使用C++ Boost Lockfree是一个用于实现无锁数据结构的库,它可以帮助我们在多线程环境下避免因为锁的使用而导致的性能下降,本文将详细介绍C++ Boost Lockfree的基本使用方法,并通过实例来帮助大家更好地理解和掌握这个库。Boost Lockfree简介Boost Lock……

    2023-12-25
    0128

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入