shell_2

来源:互联网 发布:三层网络 编辑:程序博客网 时间:2024/04/29 03:04

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 的操作对象的路径,被系统支持的操作包括文本的 openprint 等,其中 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创建的任何窗口都有可能显示在不正确的位置上。

如果这个函数执行成功,它会设置 SHELLEXECUTEINFOhInstApp成员为一个大于 32 的值。如果函数执行失败, hInstApp成员被设置为 SE_ERR_XXX (提示失败的原因)。虽然为了兼容 16 位的 windows 应用程序 hInstApp被声明成一个句柄,但它并不是一个句柄。它只能被转型为整数,并同 32 或 SE_ERR_XXX 之类的错误代码比较。

原创粉丝点击