ShellExecuteEx(转载) shellexecuteexw

http://blog.csdn.net/kesalin/article/details/4076061#

今天来说说ShellExecuteEx这个函数,先翻译MSDN,然后看个例子。

ShellExecuteEx Function

对指定应用程序执行某个操作

语法:

BOOLShellExecuteEx(
ShellExecuteEx(转载) shellexecuteexw
LPSHELLEXECUTEINFOlpExecInfo
);

参数:

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之类的错误代码比较。

提供SE_ERR_XXX之类的错误代码是为了兼容ShellExecute使用GetLastError可以获得更详细的错误信息。返回值可以使下列之一:

Error

Description

ERROR_FILE_NOT_FOUND

指定文件不存在

ERROR_PATH_NOT_FOUND

指定路径不存在

ERROR_DDE_FAIL

动态数据交换(DDE)处理失败

ERROR_NO_ASSOCIATION

没有与制定文件名扩展对应的应用程序

ERROR_ACCESS_DENIED

访问指定文件被拒绝

ERROR_DLL_NOT_FOUND

无法找到运行应用程序所必须的库文件

ERROR_CANCELLED

这个函数要求用户提供更多其他信息(译注:比如弹出对话框),但请求用户被取消了

ERROR_NOT_ENOUGH_MEMORY

没有足够的内存来执行操作

ERROR_SHARING_VIOLATION

共享违规发生了

Windows95/98/Me:ShellExecuteEx为MicrosoftLayer for Unicode (MSLU)所支持。为了使用这个函数,必须添加额外的文件到应用程序中去,请参考:MicrosoftLayer for Unicode on Windows Me/98/95 Systems.

函数信息:

Minimum DLL Version

shell32.dllversion 3.51 or later

Custom Implementation

No

Header

shellapi.h

Import library

shell32.lib

Minimum operating systems

Windows NT4.0, Windows95

Unicode

Implemented as ANSI and Unicode versions

下面举例说明如何使用这个函数,executePackage这个函数用来执行某个应用程序。

  1. boolexecutePackage(LPCWSTRfileName,LPCWSTRargs,LPCWSTRbaseDir,boolwait)
  2. {
  3. SHELLEXECUTEINFOWsei={sizeof(SHELLEXECUTEINFOW)};
  4. sei.fMask=SEE_MASK_NOCLOSEPROCESS|SEE_MASK_FLAG_NO_UI;
  5. sei.lpFile=fileName;
  6. sei.lpParameters=args;
  7. sei.lpDirectory=baseDir;
  8. if(!ShellExecuteExW(&sei)){
  9. returnfalse;
  10. }
  11. if(wait){
  12. HANDLEhProcess=sei.hProcess;
  13. if(hProcess!=0){
  14. WaitForSingleObject(hProcess,INFINITE);
  15. CloseHandle(hProcess);
  16. }
  17. }
  18. returntrue;
  19. }

===============================================================================

http://www.cppblog.com/SpringSnow/archive/2009/04/22/80719.html

题目:SHELLEXECUTEINFO和 ShellExecuteEx的使用

在日常工作中用到的一些知识,很久没有总结过,前几日参加一个会议,很是无聊。自己思索着自己这两年来所做过的东西,写着写着居然也写下了100个知识点。想把它一条一条总结下来,动笔总不是很容易。就拿这篇文章作为第一篇。

很多东西取之于网络,也有一些自己的心得。才疏学浅,就当一个知识梳理的过程吧。

第一篇 SHELLEXECUTEINFO 和 ShellExecuteEx的使用

使用SHELLEXECUTEINFO和ShellExecuteEx,我也主要是在cab包的安装时使用的。基本上是这样使用的,如下:

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);

一、SHELLEXECUTEINFO 结构

在MSDN中,它这样定义:

Contains information used by ShellExecuteEx

原型如下:

typedef struct _SHELLEXECUTEINFO{
DWORDcbSize;
ULONGfMask;
HWNDhwnd;
LPCTSTRlpVerb;
LPCTSTRlpFile;
LPCTSTRlpParameters;
LPCTSTRlpDirectory;
intnShow;
HINSTANCEhInstApp;
LPVOIDlpIDList;
LPCTSTRlpClass;
HKEYhkeyClass;
DWORDdwHotKey;
union {
HANDLEhIcon;
HANDLEhMonitor;
}DUMMYUNIONNAME;
HANDLEhProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

参数详解:

cbSize

结构大小,以字节为单位。

fMask

一个标志数组,用来设置其他成员的有效性。

hwnd

可选。执行ShellExecuteEx的窗口句柄,可设为NULL。

lpVerb

指定执行的动作,包括:edit ,explore ,find ,open,print, properties

lpFile

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

lpParameters

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

lpDirectory

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

nShow

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

hInstApp

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

lpIDList

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

lpClass

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

hkeyClass

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

dwHotKey

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

DUMMYUNIONNAME

hIcon

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

hMonitor

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

hProcess

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

二、ShellExecuteEx

功能:Performs an operation on a specifiedfile。对指定应用程序执行某个操作

原型:
BOOLShellExecuteEx(LPSHELLEXECUTEINFOlpExecInfo);

参数

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是个不错的举措。

三、例子

1、打开一个应用程序

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);

2、如何打开一个文档

程序代码如上

3、如何打开一个网页

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);

4、如何启动一个程序,直到它运行结束?

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);

四、参考文献

1、MSDN

http://msdn.microsoft.com/en-us/library/bb759784(VS.85).aspx

http://msdn.microsoft.com/en-us/library/bb762154(VS.85).aspx

2、SHELLEXECUTEINFO 结构

http://kaweh.candy.blog.163.com/blog/static/36818772200827352870/

3、说说ShellExecuteEx

http://blog.csdn.net/kesalin/category/242901.aspx

  

爱华网本文地址 » http://www.aihuau.com/a/25101016/296900.html

更多阅读

转载 你越对得罪的人越多 海外天体浴场精品转载

原文地址:你越对得罪的人越多作者:陈郴松你越对 得罪的人越多热度2已有 251 次阅读2015-9-21 16:06 |个人分类:转载|系统分类:生活你越对得罪的人越多晓姸凤平中国人求的是圆满,绝对不是对错。实际上这是最难做到的。中国人最讨厌

转载 转载:纪念叶海燕君

于是,就有无耻的文人出来骂叶海燕是妓女了。原文地址:转载:纪念叶海燕君作者:今天是明天的历史纪念叶海燕君http://club.kdnet.net/dispbbs.asp?id=9252861&boardid=1原作者:ncdjb(凯迪ID) 中华人民共和国二零一三年六月一日,就是国际六

转载 转载《一位星象学家对股市的震撼预测》 2017年股市预测

原文地址:转载《一位星象学家对股市的震撼预测》作者:周易六壬观梅刚刚看到MACD论坛金融易学专版台湾刘镇老师1月21日发表的关于2015年大盘预测的帖子《星象预测:2015年8月全球股市大崩盘》,很有研究价值,验证以往的走势也十分精确,遂转帖

浅谈英语教学法转载 英语教学法教程第二版

此内容转载自: http://163.22.168.6/~ntctenglish/Article/Luna-English_Pedagogy.doc淺談英語教學法作者:前山國小張瓊霙壹、前言國小英語教學自民國九十學年度正式實施至今已有六年的時光。國小英語教學的困境不斷浮現,這些困境

声明:《ShellExecuteEx(转载) shellexecuteexw》为网友此夏若空分享!如侵犯到您的合法权益请联系我们删除