转:ShellExecute函数与ShellExecuteEx函数
ShellExecute函数
ShellExecute函数原型及參数含义例如以下:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;
hWnd:用于指定父窗体句柄。当函数调用过程出现错误时,它将作为Windows消息窗体的父窗体。比如,能够将其设置为应用程序主窗体句柄,即 Application.Handle,也能够将其设置为桌面窗体句柄(用GetDesktopWindow函数获得)。
Operation:用于指定要进行的操作。当中“open”操作表示运行由FileName參数指定的程序,或打开由FileName參数指定的文件或目录;“print”操作表示打印由FileName參数指定的文件;“explore”操作表示浏览由FileName參数指定的目录。当參数设为nil时,表示运行默认操作“open”。
FileName:用于指定要打开的文件名称、要运行的程序文件名称或要浏览的目录名。
Parameters:若FileName參数是一个可运行程序,则此參数指定命令行參数,否则此參数应为nil或PChar(0)。
Directory:用于指定默认文件夹。
ShowCmd:若FileName參数是一个可运行程序,则此參数指定程序窗体的初始显示方式,否则此參数应设置为0。
若ShellExecute函数调用成功,则返回值为被运行程序的实例句柄。若返回值小于32,则表示出现错误。
ShellExecute函数使用方法:
怎样打开一个网页?
假设将FileName參数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将依据Windows 9x/NT注冊表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。 如:ShellExecute(handle,L"open",L" http://www.neu.edu.cn", NULL, NULL, SW_SHOWNORMAL); ShellExecute()函数在HKEY_CLASSES_ROOT\http\shell\open\command下进行搜索。默认浏览器在注冊表HKEY_CLASSES_ROOT\.htm键下的Default设置。
怎样激活相关程序,发送EMAIL?
假设将FileName參数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包含Microsoft Outlook Express)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将依据Windows 9x/NT注冊表中mailto协议处理程序的设置确定启动哪个邮件客户程序。mailto:用户账号@邮件server地址?subject=邮件主题&body=邮件正文; 如:ShellExecute(handle,
L"open", L" mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test", NULL,NULL, SW_SHOWNORMAL);打开新邮件窗体,并自己主动填入收件人地址、邮件主题和邮件正文。若邮件正文包含多行文本,则必须在每行文本之间增加换行转义字符%0a。ShellExecute()函数在HKEY_CLASSES_ROOT\mailto\shell\open\command下搜索。
怎样打开一个程序?
ShellExecute(NULL,L"open",L"notepad.exe", L"c:\\MyLog.log", NULL, SW_SHOW );
怎样用系统打印机打印文档?
ShellExecute(NULL,L"print", L"c:\\abc.txt",NULL, NULL, SW_HIDE);
怎样用系统查找功能来查找指定文件?
ShellExecute(NULL,L"find",L"d:\\nish", NULL, NULL, SW_SHOW);
怎样启动一个程序,直到它执行结束?
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile =L"c:\\MyProgram.exe";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
或:
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo; //This is an [in] parameter
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field
if(CreateProcess(L"c:\\winnt\\notepad.exe", NULL, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo,&ProcessInfo))
{
WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
MessageBox(NULL,L"The process could not be started",NULL,NULL);
怎样显示文件或目录的属性?
SHELLEXECUTEINFO ShExecInfo ={0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = L"properties";
ShExecInfo.lpFile = L"c:\\"; //can be a file as well
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
ShellExecuteEx函数
此部分转自点击打开链接
ShellExecute()有一个难于使用的重大障碍:它不能返回或使你知道新建进程的Handle。也就是说,你不能导出程序并在继续运行之前等待它终止。换句话说ShellExecute()受到了它的16位血统的损害,它只发掘了新的和更有威力的函数CreateProcess()的一个特征子集—WinExec()也支持的子集。然而在4.0以后版本号中引进了一个新函数:ShellExecuteEx()。它有一个Shell函数典型的原型,支持多标志,以及上述全部功能,通过提供对进程同步和PIDLs的支持扩展了ShellExecute()。
ShellExecuteEx()函数明白地代替了ShellExecute()。它在shellapi.h中声明:BOOL ShellExecuteEx(LPSHELLEXECUTEINFO lpExecInfo);
SHELLEXECUTEINFO定义例如以下:
typedef struct _SHELLEXECUTEINFO
{
DWORD cbSize;
ULONG fMask;
HWND hwnd;
LPCTSTR lpVerb;
LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
// 可选的成员
LPVOID lpIDList;
LPCSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
HANDLE hIcon;
HANDLE hProcess;
} SHELLEXECUTEINFO, FAR *LPSHELLEXECUTEINFO;
在使用这个结构之前,我们极力建议你把它充填为0,并设置cbSize到结构的实际长度,操作例如以下:
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
正如声明中的凝视所说,结构的成员分成了两组。实际上,头一组使ShellExecuteEx()的功能等价于ShellExecute()。而选项成员组使函数更有力,这正是‘Ex’后缀的由来。hwnd, lpVerb, lpFile, lpParameters, lpDirectory 和 nShow成员等价于ShellExecute()的參数,这是我们已经看到的。而hInstApp成员则是一个输出缓冲,这将由ShellExecute()的返回值填写。nShow成员总是表示建立窗体的风格,即使lpFile是一个应用程序,它也只说明应用应该如何显示。不管lpFile是应用程序还是文档文件,nShow必须总是赋值为SW_型常量,你是知道的,假设设置为0将获得隐藏窗体。
以下是调用ShellExecuteEx()的最简单方法:
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = __TEXT("explorer.exe");
sei.nShow = SW_SHOW;
sei.lpVerb = __TEXT("open");
ShellExecuteEx(&sei);
ShellExecute()中相应參数的成员之中的一个是fMask。它能够是一个或多个以下值的组合:
标志 描写叙述
SEE_MASK_CLASSKEY 应该使用 hkeyClass 成员
SEE_MASK_CLASSNAME 应该使用 lpClass 成员
SEE_MASK_CONNECTNETDRV lpFile将被解释成UNC(通用命名习惯)格式的文件名称
SEE_MASK_DOENVSUBST 不论什么在lpDirectory和lpFile成员中的环境变量都将被展开,比如,%WINDIR% 打开Windows目录
SEE_MASK_FLAG_DDEWAIT 假设函数启动DDE会话,在返回之前等待它终止。
SEE_MASK_FLAG_NO_UI 在错误情况下不显示消息框
SEE_MASK_HOTKEY 应该使用 dwHotkey 成员
SEE_MASK_ICON 应该使用 hIcon 成员
SEE_MASK_IDLIST 强制函数使用lpIDList内容取代lpFile
SEE_MASK_INVOKEIDLIST 引起函数使用lpIDList中指定的PIDL。假设这个成员为NULL,则建立一个lpFile的PIDL,并使用这个PIDL。这个标志重载了SEE_MASK_IDLIST
SEE_MASK_NOCLOSEPROCESS 用进程Handle设置hProcess成员。lpIDList成员能够包括一个用于取代lpFile的PIDL。hProcess返回导出的HPROCESS类型的新进程handle
附加的特征
可选字段适用于某些超出ShellExecute()的附加功能。第一点,也是最重要的一点,能够使用PIDLs来执行应用和打开目录。以下是打开‘打印机’目录的代码:
LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &pidl);
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.nShow = SW_SHOW;
sei.lpIDList = pidl;
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = __TEXT("open");
ShellExecuteEx(&sei);
假设指定了SEE_MASK_DOENVSUBST标志,则能够在lpFile和lpDirectory中使用不论什么环境变量。比如,要打开Windows文件夹,能够表示为%WINDIR%。
最后,我们获得了由ShellExecuteEx()导出的应用的同步能力。在设置了SEE_MASK_NOCLOSEPROCESS位到fMask成员后,新进程的handle将由hProcess成员返回,因此这一行代码:WaitForSingleObject(sei.hProcess, INFINITE);将导致调用的应用堵塞,等待还有一个应用终止。
显示文件属性对话框
SEE_MASK_INVOKEIDLIST标志是一个重要标志,由于这是ShellExecuteEx()还有一个优于ShellExecute()的亮点:它同意函数象执行静态动词那样唤醒动态动词。前面解释过,动态动词是执行时由Shell扩展的关联菜单加入的。其工作方法是:假设ShellExecuteEx()不能在静态动词列表中找到这个动词,它就试图寻找给定文件的关联菜单。这个搜索引出IContextMenu接口指针。然后通过接口暴露的方法唤醒动态动词。
作为这个操作的结论,我们能够非常easy地显示文件的属性对话框—与右击文件,然后选择属性显示的对话框同样。这里是一个简单的样例函数:
void ShowFileProperties(LPCTSTR szPathName)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = szPathName;
sei.nShow = SW_SHOW;
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpVerb = __TEXT("properties");
ShellExecuteEx(&sei);
}
转:ShellExecute函数与ShellExecuteEx函数的更多相关文章
- 深入理解javascript函数定义与函数作用域
最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...
- JavaScript 函数节流和函数去抖应用场景辨析
概述 也是好久没更新 源码解读,看着房价蹭蹭暴涨,心里也是五味杂陈,对未来充满恐惧和迷茫 ...(敢问一句你们上岸了吗) 言归正传,今天要介绍的是 underscore 中两个重要的方法,函数节流和函 ...
- 如果你也会C#,那不妨了解下F#(4):了解函数及常用函数
函数式编程其实就是按照数学上的函数运算思想来实现计算机上的运算.虽然我们不需要深入了解数学函数的知识,但应该清楚函数式编程的基础是来自于数学. 例如数学函数\(f(x) = x^2+x\),并没有指定 ...
- js函数表达式和函数声明的区别
我们已经知道,在任意代码片段外部添加包装函数,可以将内部的变量和函数定义"隐 藏"起来,外部作用域无法访问包装函数内部的任何内容. 例如: var a = 2; function ...
- [Machine Learning] logistic函数和softmax函数
简单总结一下机器学习最常见的两个函数,一个是logistic函数,另一个是softmax函数,若有不足之处,希望大家可以帮忙指正.本文首先分别介绍logistic函数和softmax函数的定义和应用, ...
- oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数
花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...
- Oracle中的CHR()函数与ASCII()函数
工作中经常会处理一些因特殊字符而导致的错误,如上周我就遇到了因为换行符和回车符导致的数据上报的错误,这种错误比较难以发现,通常是由于用户的输入习惯导致的,有可能数据极少,就那么几行错误从而导致整个数据 ...
- 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解
'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...
- javascript中函数声明和函数表达式浅析
记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方 ...
随机推荐
- POJ1149 PIGS 【最大流量】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16555 Accepted: 7416 Description ...
- Java 新特性(7) - Java EE 7 新特性
http://www.ibm.com/developerworks/cn/java/j-lo-javaee7/ 新特性主要集中在: 1. 提高开发人员的生产力 2. 加强对 HTML5 动态可伸缩应用 ...
- RH253读书笔记(10)-Appendix A Installing Software
Appendix A Installing Software Below are a few methods to locate and install required packages. You ...
- apk反编译工具-apktool
apk很easy被反编译,关于这篇文章apktool反编译工具. (一)优势反编译 1.能学习别人优秀代码 看看优秀apk他们的string.color命名规则,看看布局排版等都能学习到东西. 2.进 ...
- 学习笔记 broswerify + watchify + beefy
broswerify “Browserify lets you require('modules') in the browser by bundling up all of your depende ...
- matlab简单实现SVD的推荐
%svd chengxu A = [5 5 0 5;5 0 3 4; 3 4 0 3; 0 0 5 3; 5 4 4 5; 5 4 5 5]; A = A'; [U S V] = svd(A); U ...
- 微软可疑更新DhMachineSvc.exe
微软最近推出了大规模的更新仅针对中国.它包括DhMachineSvc.exe.所谓'微软设备健康助手服务'. 此更新是惊人的,首先,此更新只针对中国地区,其次,此更新支持WinXP,第三次更新一定的强 ...
- mvc5 解析route源码实现自己的route系统
Asp.net mvc5 解析route源码实现自己的route系统 url route 路由系统的责任是找到匹配的路由,创建路由数据,并将请求分配给一个处理程序. 选择动作是 MVC 的处理程序 ...
- WordPress添加评论回复的电子邮件警报通知
评论回复帖子,主动发送电子邮件通知评论员,这是提高的一大举措的用户体验.倡导孟一直在使用Willin Kan主评论回复电子邮件警报通知码,我相信很多人也使用,假设你没有使用.最好的尝试. 根据自己的需 ...
- Lake Counting (DFS)
N*M的园子,雨后积起了水.八连通的积水背认为是连接在一起的.请求出园子里总共有多少水洼? dfs(Depth-First Search) 八个方向的简单搜索.... 深度优先搜索从最开始的状态出 ...