说说ShellExecuteEx
今天来说说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 创建的不论什么窗体都有可能显示在不对的位置上。
假设这个函数运行成功,它会设置 SHELLEXECUTEINFO 的hInstApp 成员为一个大于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的更多相关文章
- 【转】vc++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 --- 获取管理员权限
ShellExecuteEX编程 --- 获取管理员权限:http://blog.csdn.net/jhui163/article/details/5873027 怎样让你的应用程序获得管理员权限:就 ...
- ShellExecuteEx的使用方法
关于怎样在c++中启动外部的exe程序,之前看到在百度一搜就看到了: ShellExecute(this->m_hWnd,"open","calc.exe" ...
- 转:ShellExecute函数与ShellExecuteEx函数
ShellExecute函数 ShellExecute函数原型及參数含义例如以下: function ShellExecute(hWnd: HWND; Operation, FileName, Par ...
- ShellExecuteEX打开iqy文件导致excel hang的原因分析
1. 问题 当在console中调用API ShellExecuteEx打开"test.iqy"文件时,发现excel会hang住,console退出后excel才会响应,但直接双 ...
- C/C++ ShellExecuteEx调用exe可执行文件
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49591995 以商业的软件Enblen ...
- API函数ShellExecute与ShellExecuteEx用法
ShellExecute: 1.函数功能:你可以给它任何文件的名字,它都能识别出来并打开它.2.函数原型: HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpO ...
- VC程序获取管理员权限
一: 编译程序的时候设置一下 在项目属性--连接器--清单文件--UAC执行级别改为requireAdministrator 二: void GainAdminPrivileges(CString s ...
- 转:Delphi 6 实用函数
来自: daocaoren0824, 时间: -- ::, ID: 再给你一份 程序员实用函数 {▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎▎} {▎ ▎} {▎ 大 ...
- System.Diagnostics.Process.Star的用法
System.Diagnostics.Process.Start(); 能做什么呢?它主要有以下几个功能: 1.打开某个链接网址(弹窗). 2.定位打开某个文件目录. 3.打开系统特殊文件夹,如“控制 ...
随机推荐
- Why Hadoop2
自从Hadoop2出现之后,其迅速代替了Hadoop1的地位,并丰富了Hadoop的应用场景.假设如今有公司使用Hadoop的话,往往直接採用Hadoop2了. Hadoop2能被如此广泛的使用,肯定 ...
- 曾经很长时间不会写的两个SQL语句(group by,having)
1.统计各部门的平均工资,平均资金(要求同时显示出部门名称,部门编号,部门总人数) SQL)),) 部门平均工资,)),) 部门平均资金 FROM EMP E RIGHT JOIN DEPT D ON ...
- Glide的加载图片的帮助类,用来把图片圆角或者改成圆形图片
Glide虽然非常好用但是没找到把图片圆角的方法,所以百度了一个非常不错的加载类自己实现圆角图 感谢原文章作者:http://blog.csdn.net/weidongjian/article/det ...
- .NET winform 的keypress事件中判断当用户按下的是哪个键
keys是按键的枚举类型 private void txtPropertyValue_KeyPress(object sender, KeyPressEventArgs e) { if ((Keys) ...
- C语言enum再学习
通常来说我们使用enum是这样的: enum week{ Mon, Tue, ... Sun }; enum week w; w = Mon; 这里默认Mon~Sun的值为0~6 也可以自己定值 , ...
- VLC的相关文档以及javascript接口
参看下面链接:VLC相关文档
- [C++程序设计]字符数组的赋值与引用
只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值. char c[5]; c={′C′,′h′,′i′,′n′,′a′}; //错误,不能对整个数组一次赋值 c[0]=′C′; c[1]=′h ...
- 闲聊之Python的数据类型 - 零基础入门学习Python005
闲聊之Python的数据类型 让编程改变世界 Change the world by program Python的数据类型 闲聊之Python的数据类型所谓闲聊,goosip,就是屁大点事可以咱聊上 ...
- sql中插入多条记录-微软批处理
这是使用批处理的一个例子: System.IO.StreamWriter messagelog = null; string messageString = ""; SqlConn ...
- wget 测试cdn
可以通过wget 或curl 指定代理ip来访问同一个链接的不同cdn响应页面.来测试不同cdn间的数据同步问题.