本文共 2939 字,大约阅读时间需要 9 分钟。
在 MSDN 中,SHELLEXECUTEINFO 是一个用于 ShellExecuteEx 函数的结构体,包含了执行 Shell 操作所需的各项信息。该结构体的原型定义如下:
typedef struct _SHELLEXECUTEINFO { DWORD cbSize; ULONG fMask; HWND hwnd; LPCTSTR lpVerb; LPCTSTR lpFile; LPCTSTR lpParameters; LPCTSTR lpDirectory; int nShow; HINSTANCE hInstApp; // 可选成员 LPVOID lpIDList; LPCSTR lpClass; HKEY hkeyClass; DWORD dwHotKey; HANDLE hIcon; HANDLE hProcess;} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO; cbSize
结构体的大小,以字节为单位。fMask
标志位数组,用于标记其他成员的有效性。hwnd
可选参数,执行 ShellExecuteEx 的窗口句柄,可设为 NULL。lpVerb
指定执行的动作,支持的动作包括:edit、explore、find、open、print、properties。lpFile
以\0 结尾的字符串,指定 lpVerb 操作对象的路径,支持的操作包括文本的打开和打印。lpParameters
可选参数,用于运行或打开程序的命令行参数。如果是打开文档,则该参数无效。lpDirectory
可选参数,指定工作目录的名称,默认为当前目录。nShow
必须参数,指定打开的程序显示方式,取自SW_ 常数。hInstApp
【输出】如果设置SEE_MASK_NOCLOSEPROCESS 并且调用成功,则该参数的值大于 32;如果失败,则设置为 SE_ERR_XXX 错误值。lpIDList
指向ITEMIDLIST 结构的地址,存储操作的特殊标识符。仅在 fMask 包含 SEE_MASK_IDLIST 或 SEE_MASK_INVOKEIDLIST 时有效。lpClass
指明文件类型的名称或 GUID。仅在fMask 包含 SEE_MASK_CLASSNAME 时有效。hkeyClass
获取已注册的文件类型的句柄。仅在fMask 包含 SEE_MASK_HOTKEY 时有效。dwHotKey
程序的热键关联,低位存储虚拟键码,高位存储修改标志位(HOTKEYF_)。hIcon
获取对应文件类型的图标句柄。仅在fMask 包含 SEE_MASK_ICON 时有效。hProcess
指向新启动程序的句柄。如果fMask 不设为 SEE_MASK_NOCLOSEPROCESS,则该值为 NULL。即使设置了 SEE_MASK_NOCLOSEPROCESS,如果程序未启动,值仍为 NULL。ShellExecuteEx 是 Windows API 中用于执行 Shell 操作的函数。它允许开发者通过指定路径和动作,直接启动应用程序或文档。
BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);
SHELLEXECUTEINFO 结构体,用于传递和保存执行相关信息。###备注
COM 初始化
在调用ShellExecuteEx 之前,建议先初始化 COM。部分 Shell 扩展要求使用单线程单元模型 COM,因此应使用以下代码进行初始化:CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
不过,某些情况下 ShellExecuteEx 不需要这种类型的 Shell 扩展,使用前初始化 COM 是一个好的做法。
SHELLEXECUTEINFO ShellInfo;memset(&ShellInfo, 0, sizeof(ShellInfo));ShellInfo.cbSize = sizeof(ShellInfo);ShellInfo.hwnd = NULL;ShellInfo.lpVerb = _T("open");ShellInfo.lpFile = szFilePath; // 写入执行文件的绝对路径ShellInfo.nShow = SW_SHOWNORMAL;ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;BOOL bResult = ShellExecuteEx(&ShellInfo); 与上述代码相同,只需确保 lpFile 指向文档的路径即可。
SHELLEXECUTEINFO ShellInfo;memset(&ShellInfo, 0, sizeof(ShellInfo));ShellInfo.cbSize = sizeof(ShellInfo);ShellInfo.hwnd = NULL;ShellInfo.lpVerb = _T("open");ShellInfo.lpFile = _T("http://www.sina.com");ShellInfo.nShow = SW_SHOWNORMAL;ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;BOOL bResult = ShellExecuteEx(&ShellInfo); SHELLEXECUTEINFO ShellInfo;memset(&ShellInfo, 0, sizeof(ShellInfo));ShellInfo.cbSize = sizeof(ShellInfo);ShellInfo.hwnd = NULL;ShellInfo.lpVerb = _T("open");ShellInfo.lpFile = szFilePath;ShellInfo.nShow = SW_SHOWNORMAL;ShellInfo.fMask = SEE_MASK_NOCLOSEPROCESS;ShellExecuteEx(&ShellInfo);WaitForSingleObject(ShellInfo.hProcess, INFINITE); 以上内容结合了 MSDN 文档和实际开发经验,供开发者参考使用。
转载地址:http://elpuz.baihongyu.com/