SHELLEXECUTEINFO 结构详解
SHELLEXECUTEINFO 是一个结构体,用于在 Windows 操作系统中执行一个或多个命令行程序,它提供了一个简单的方法来启动外部程序,并可以获取程序的输出和错误信息,本文将详细介绍 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,则使用调用进程的当前工作目录。
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。
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