LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
LPVOID lpIDList;
LPCTSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
在C#中其结构为
public struct SHELLEXECUTEINFO // 用于 ShellExecuteEx
{
public int cbSize;
public int fMask;
public int hwnd;
public string lpVerb;
public string lpFile;
public string lpParameters;
public string lpDirectory;
public int nShow;
public int hInstApp;
public int lpIDList;
public string lpClass;
public int hkeyClass;
public int dwHotKey;
public int hIcon;
public int hProcess;
}
参数详解:
cbSize
存储该结构的长度,以字节为单位。
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
hwnd
调用这个 ShellExecuteEx 的窗口句柄
lpVerb
设定这个 ShellExecuteEx 的动作,包括:
edit
打开编辑器编辑文档,如果 lpFile 不是一个文档,则这个函数会失败
explore
以 lpFile 为路径打开资源管理器
find
从指定目录开始搜索
open
根据 lpFile 打开对应文件,该文件可以为可执行文件、文档或者文件夹
print
根据 lpFile 打印文档,若 lpFile 不是一个文档则该函数会失败
properties
显示文件或文件夹的属性
lpFile
以 /0 结尾的字符串,指出 lpVerb 的操作对象的路径,被系统支持的操作包括文本的 open 、 print 等,其中 print 要求必须有一个已经注册的打印机,而其他种类的文档会通过系统关联进行查询执行。若要设置一个空的 namespace ,则需要设置 fMask 的值为 see_mask_invokeidlist。
注意: 若 see_mask_invokeidlist 已设置,则可以藉由 lpFile 或者 lpIDList 确定 item 的系统路径或者 PIDL
lpParameters
运行 / 打开程序的参数,如果打开的是一个文档,则该项无效
lpDirectory
指明工作目录的名字,成员没有说明,则默认为当前目录
nShow
说明 ShellExecuteEx 打开的程序将以什么形式出现
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
没有找到文件关联
lpIDList
一个 itemidlist 结构的地址,用来存储成员的特别标识符,当 fMask 不包括 see_mask_idlist 或 see_mask_invokeidlist 时该项被忽略
lpClass
用以指明文件类别的名字或 GUID ,当 fMask 不包括 see_mask_classname 时该项被忽略
hkeyClass
获得已在系统注册的文件类型的 Handle ,当 fMask 不包括 see_mask_classkey 时该项被忽略
dwHotKey
程序的热键关联,低位存储虚拟关键码( Key Code ),高位存储修改标志位 (HOTKEYF_) ,修改标志为( modifier flags )的详细列表请看 wm_sethotkey 消息的描述,当 fmask 不包括 see_mask_hotkey 时该项被忽略
DUMMYUNIONNAME
hIcon
取得对应文件类型的图标的 Handle ,当 fMask 不包括 SEE_MASK_ICON 时该项被忽略
hMonitor
将文档显示在显示器上的 Handle ,当 fMask 不包括 SEE_MASK_HMONITOR 时该项被忽略
hProcess
用于进行 return 操作的成员,若 fMask 不设为 see_mask_nocloseprocess 则该项值为 null ,即使 fMask 设为 see_mask_nocloseprocess ,若没有进程启动,该项值仍为 null 。即没有新的进程启动,则该项值一只为 null
3 、说说 ShellExecuteEx
http://blog.csdn.net/kesalin/category/242901.aspx
ShellExecuteEx Function
对指定应用程序执行某个操作
语法:
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 是个不错的举措。
如果有多个显示器,并且你指定了一个 HWND同时设置 lpExecInfo的成员 lpVerb为 "Properties" ,那么由 ShellExecuteEx创建的任何窗口都有可能显示在不正确的位置上。
如果这个函数执行成功,它会设置 SHELLEXECUTEINFO的 hInstApp成员为一个大于 32 的值。如果函数执行失败, hInstApp成员被设置为 SE_ERR_XXX (提示失败的原因)。虽然为了兼容 16 位的 windows 应用程序 hInstApp被声明成一个句柄,但它并不是一个句柄。它只能被转型为整数,并同 32 或 SE_ERR_XXX 之类的错误代码比较。