您的位置:首页 > 运维架构 > Shell

SHELLEXECUTEINFO,ShellExecuteEx

2016-06-17 16:19 525 查看
一、SHELLEXECUTEINFO结构体
原型如下
typedef struct _SHELLEXECUTEINFO {

       DWORD cbSize;  //结构大小,以字节为单位。
      ULONG fMask;   //一个标志数组,用来设置其他成员的有效性。
      HWND hwnd;     //可选。执行ShellExecuteEx的窗口句柄,可设为NULL.

       LPCTSTR lpVerb;//指定执行的动作,包括:edit ,explore ,find ,open,print, pro                         
perties

       LPCTSTR lpFile;  //以\0 结尾的字符串,指出 lpVerb 的操作对象的路径,被系统支持的操作包括文本的 open 、 print等

       LPCTSTR lpParameters;//可选。运行/打开程序的参数,如果打开的是一个文档,则该项无效

       LPCTSTR lpDirectory;//可选。指明工作目录的名字,成员没有说明,则默认为当前目录

       int nShow;//必须。指定打开的程序的显示方式,为SW_值中的一个。

       HINSTANCE hInstApp;
//【out】如果设置SEE_MASK_NOCLOSEPROCESS
S值并且ShellExecuteEx 调用成功,则该项的值大于32,如果调用失败,则将设置为 SE_ERR_XXX 的错误值。

       LPVOID lpIDList;//一个ITEMIDLIST结构的地址,用来存储成员的特别标识符,当fMask不包括
SEE_MASK_IDLIST
SEE_MASK_INVOKEIDLIST
时该项被忽略

       LPCTSTR lpClass;//用以指明文件类别的名字或GUID,当fMask不包括
SEE_MASK_CLASSNAME
时该项被忽略

       HKEY hkeyClass;//获得已在系统注册的文件类型的Handle,当fMask不包括
SEE_MASK_HOTKEY
时该项被忽略

       DWORD dwHotKey;
//程序的热键关联,低位存储虚拟关键码(Key Code),高位存储修改标志位(HOTKEYF_),修改标志为(modifier
flags)的详细列表请看WM_SETHOTKEY消息的描述,当fmask不包括
SEE_MASK_HOTKEY
时该项被忽略

       union {

          HANDLE hIcon;//取得对应文件类型的图标的Handle,当fMask不包括SEE_MASK_ICON时该项被忽略

          HANDLE hMonitor;//将文档显示在显示器上的Handle,当fMask不包括SEE_MASK_HMONITOR时该项被忽略

       } DUMMYUNIONNAME;

      HANDLE hProcess;
//指向新启动的程序的句柄。若fMask不设为
SEE_MASK_NOCLOSEPROCESS
则该项值为NULL。但若程序没有启动,即使fMask设为
SEE_MASK_NOCLOSEPROCESS
,该值也仍为NULL。

} SHELLEXECUTEINFO,*LPSHELLEXECUTEINFO;
参数:
fMask
一个标志数组,用来设置其他成员的有效性

SEE_MASK_CLASSKEY          0x3

SEE_MASK_CLASSNAME          0x1

SEE_MASK_CONNECTNETDRV      0x80

SEE_MASK_DOENVSUBST          0x200

SEE_MASK_FLAG_DDEWAIT      0x100

SEE_MASK_FLAG_LOG_USAGE      0x4000000

SEE_MASK_FLAG_NO_UI          0x400

SEE_MASK_HMONITOR          0x200000

SEE_MASK_HOTKEY          0x20

SEE_MASK_ICON             0x10

SEE_MASK_IDLIST          0x4

SEE_MASK_INVOKEIDLIST      0xC

SEE_MASK_NOASYNC          0x100000

SEE_MASK_NOCLOSEPROCESS      0x40

SEE_MASK_NOZONECHECKS      0x800000

SEE_MASK_NO_CONSOLE          0x8000

SEE_MASK_UNICODE          0x100000

SEE_MASK_FILEANDURL          0x4000000
 
lpVerb
设定这个ShellExecuteEx的动作,包括:
edit 
打开编辑器编辑文档,如果 lpFile 不是一个文档,则这个函数会失败
explore 
以 lpFile 为路径打开资源管理器
find 
从指定目录开始搜索
open
根据 lpFile 打开对应文件,该文件可以为可执行文件、文档或者文件夹
print
根据 lpFile 打印文档,若lpFile不是一个文档则该函数会失败 
properties 
显示文件或文件夹的属性
 
hInstApp
如果函数运行成功,该项的值将大于32,否则会是下列错误对应的值
SE_ERR_FNF 
没有找到文件 
SE_ERR_PNF
没有找到路径
SE_ERR_ACCESSDENIED 
拒绝访问
SE_ERR_OOM 
内存不足
SE_ERR_DLLNOTFOUND 
没有找到动态链接库
SE_ERR_SHARE 
不能操作一个以打开的文件
SE_ERR_ASSOCINCOMPLETE 
文件关联信息不完整
SE_ERR_DDETIMEOUT 

DDE操作超时
SE_ERR_DDEFAIL 

DDE操作失败
SE_ERR_DDEBUSY 
DDE繁忙
SE_ERR_NOASSOC 
没有找到文件关联
二、ShellExecuteEx
功能:Performs an operation on a specifiedfile。对指定应用程序执行某个操作
原型:
BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);
参数
lpExecInfo
[in, out] 一个指向 SHELLEXECUTEINFO 结构的指针,用来传递和保存应用程序执行相关的信息。
返回值
如果函数成功执行就返回TRUE,否则返回 FALSE 。可调用 GetLastError 获取错误信息。
备注
由于ShellExecuteEx 能够将执行委托给那些由组件对象模型COM激活的Shell 扩展(数据源,上下文菜单句柄,动词实现),因此在调用ShellExecuteEx 之前要先初始化 COM。某些Shell 扩展要求单线程单元模型的COM,在这种情况下,应当像下面一般初始化COM:
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)
在某些情况下 ShellExecuteEx 并没有使用这种类型的Shell 扩展,这时就无需初始化COM。虽然如此,总是在使用这个函数之前初始化COM是个不错的举措。
 
 例子:
SHELLEXECUTEINFO ShExecInfo = {0};
    ShExecInfo.cbSize= sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask= SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd= NULL;
    ShExecInfo.lpVerb= "open";
    ShExecInfo.lpFile= "FaceRecogTrainPlatform.exe";//调用exe
         ShExecInfo.lpParameters = param;//传参
ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow= SW_SHOW;
    ShExecInfo.hInstApp= NULL;
    ShellExecuteEx(&ShExecInfo);//ShExecInfo调用结构体

//等到程序跑完了再干其他事情

    WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
//调用是否成功
GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);
printf("Exit code(Read) : %d\n", dwExitCode); 
 
以上代码所需要的头文件:
#include <windows.h>
#include<ShellAPI.h>    // ShellExecuteEx
#include <tchar.h>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息