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

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

提供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

共享违规发生了

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

函数信息:

Minimum DLL Version

shell32.dll version 3.51 or later

Custom Implementation

No

Header

shellapi.h

Import library

shell32.lib

Minimum operating systems

Windows NT 4.0, Windows 95

Unicode

Implemented as ANSI and Unicode versions

以下举例说明怎样使用这个函数,executePackage 这个函数用来运行某个应用程序。

bool executePackage(LPCWSTR fileName, LPCWSTR args, LPCWSTR baseDir, bool wait)
{
SHELLEXECUTEINFOW sei = { sizeof(SHELLEXECUTEINFOW) };

sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;

sei.lpFile = fileName;
sei.lpParameters = args;
sei.lpDirectory = baseDir;

if (!ShellExecuteExW(&sei)) {
return false;
}

if (wait) {
HANDLE hProcess = sei.hProcess;
if (hProcess != 0) {
WaitForSingleObject(hProcess, INFINITE);
CloseHandle(hProcess);
}
}

return true;
}

说说ShellExecuteEx的更多相关文章

  1. 【转】vc++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 --- 获取管理员权限

    ShellExecuteEX编程 --- 获取管理员权限:http://blog.csdn.net/jhui163/article/details/5873027 怎样让你的应用程序获得管理员权限:就 ...

  2. ShellExecuteEx的使用方法

    关于怎样在c++中启动外部的exe程序,之前看到在百度一搜就看到了: ShellExecute(this->m_hWnd,"open","calc.exe" ...

  3. 转:ShellExecute函数与ShellExecuteEx函数

    ShellExecute函数 ShellExecute函数原型及參数含义例如以下: function ShellExecute(hWnd: HWND; Operation, FileName, Par ...

  4. ShellExecuteEX打开iqy文件导致excel hang的原因分析

    1. 问题 当在console中调用API ShellExecuteEx打开"test.iqy"文件时,发现excel会hang住,console退出后excel才会响应,但直接双 ...

  5. C/C++ ShellExecuteEx调用exe可执行文件

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49591995 以商业的软件Enblen ...

  6. API函数ShellExecute与ShellExecuteEx用法

    ShellExecute: 1.函数功能:你可以给它任何文件的名字,它都能识别出来并打开它.2.函数原型: HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpO ...

  7. VC程序获取管理员权限

    一: 编译程序的时候设置一下 在项目属性--连接器--清单文件--UAC执行级别改为requireAdministrator 二: void GainAdminPrivileges(CString s ...

  8. 转:Delphi 6 实用函数

    来自: daocaoren0824, 时间: -- ::, ID: 再给你一份 程序员实用函数 {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ ▎} {▎ 大 ...

  9. System.Diagnostics.Process.Star的用法

    System.Diagnostics.Process.Start(); 能做什么呢?它主要有以下几个功能: 1.打开某个链接网址(弹窗). 2.定位打开某个文件目录. 3.打开系统特殊文件夹,如“控制 ...

随机推荐

  1. Unity 启动画面淡入淡出

    前几天在玩我叫MT 2游戏的时候发现打开他们应用的时候发现他们Logo淡入淡出的效果做的挺好的,例如第一张是运营商腾讯的logo第二张是他们公司的游戏logo.我们也来模仿一下: 第一张图片:运营商的 ...

  2. java获取当前系统毫秒,纳秒

    //获取当前系统毫秒 System.out.println(System.currentTimeMillis()); //获取当前系统纳秒 System.out.println(System.nano ...

  3. js 代码命名规范系列

    在微博上看到一个段子 “老子哪天出任ceo迎娶白富美走上人生巅峰之后,一定要雇两个长腿大熊的妹子.一个帮我想变量名字,一个帮我想git commit的message!” 可以看出 命名方方面面的问题困 ...

  4. parseInt引发的血案

    今天做了个专题活动,页面头上有个倒计时 专题做完后上线了,没发现有什么问题,结果,运营MM突然和我说:技术哥哥出问题了,360浏览器在秒数从10到09的时候直接变成 00 了! 一看我去真的,该死的3 ...

  5. SQL Server -SET ANSI_NULLS

    当ANSI_NULLS 为ON时,遵循SQL92的标准,只能使用IS NULL 来判断值是否为NULL, 而不能使用=或<>来与NULL做比较,任何值包括NULL值与NULL值做=或< ...

  6. .net下载

    1,Http 协议中有专门的指令来告知浏览器, 本次响应的是一个需要下载的文件. 格式如下: Content-Disposition: attachment;filename=filename.ext ...

  7. setNeedsDisplay、layoutSubViews

    UIView的setNeedsDisplay和setNeedsLayout方法.首先两个方法都是异步执行的.而setNeedsDisplay会调 用自动调用drawRect方法,这样可以拿到UIGra ...

  8. Mysql操作个人收集

    1.MySQL修改root密码 mysql> UPDATE user SET Password=PASSWORD('xxxx') where USER='root'; mysql> FLU ...

  9. 混合高斯模型和EM算法

    这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类别标签用表示 ...

  10. docker镜像与容器存储结构分析

    注意:转载请注明出处:http://www.programfish.com/blog/?p=9 Docker是一个开源的应用容器引擎,主要利用linux内核namespace实现沙盒隔离,用cgrou ...