转: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:[email protected]?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);

}

时间: 2024-08-05 09:37:05

转:ShellExecute函数与ShellExecuteEx函数的相关文章

async(await)函数和 Generator 函数 区别

async 函数是 Generator 函数的语法糖. async 函数对 Generator 函数的改进体现在: 1. async 内置执行器. Generator 函数的执行必须靠执行器,需要调用 next() 方法,或者用co 模块:而 async 函数自带执行器.也就是说,async 函数的执行与普通函数一模一样,只要一行. 2. 更好的语义. async 和 await 比起星号和 yield,语义更清楚. 3.更广的适用性. co 模块约定,yield 命令后面只能是 Thunk 函

Python-lambda函数,map函数,filter函数

lambda函数主要理解: lambda 参数:操作(参数). lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值.lambda语句构建的其实是一个函数对象 map函数: map(function_to_apply, list_of_inputs).map函数可以把list_of_inputs内的对象依次输入到function_to_apply中进行操作. filter函数: filter(function_to_apply, list_of_inputs).Filter

C#委托与C语言函数指针及函数指针数组

C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用的时候通过指针访问这个函数. 在C语言中函数指针的申明如下: //可以理解为申明一个指着变量 Func ,它的类型是 返回Type(可以为 void )类型的参数,接收 (Type one,Type two,...)类型的//参数(可以不接受参数). Type *Func(Type one,Type

oracle listagg函数、lag函数、lead函数 实例

Oracle大师Thomas Kyte在他的经典著作中,反复强调过一个实现需求方案选取顺序: “如果你可以使用一句SQL解决的需求,就使用一句SQL:如果不可以,就考虑PL/SQL是否可以:如果PL/SQL实现不了,就考虑Java存储过程是否可以:如果这些都不可能实现,那么就需要考虑你是否真的需要实现这个需求.” 各个关系型DBMS产品都在遵守关系型数据库模型的基本体系架构,遵循通用的SQL国际规范.同时,为了更好地配合自身数据库实现的特征,以及提供更加丰富的功能,各个DBMS纷纷在标准SQL上

JS杂谈系列-函数知识、函数模式

函数,函数,function,function,go go go! 创建函数: 第一种:function aa(){alert(1)}; 第二种:var aa=function(){alert(1)}; 其实对于使用没有太大的区别,第一个是用函数关键字创建,第二个是创建变量,然后赋值为一个函数. 同样我们还可以创建匿名函数 function(){alert(1)}; 函数的里面可以传递参数arg function aa(arg){alert(arg)}; function aa(arg1,arg

javascript 函数声明和函数表达式的区别(学习笔记)

javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用. 3).以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明. 下面分别用两种方法定义函数:

itoa函数,sprintf函数

itoa函数 itoa 为c语言的一个函数.itoa 函数是一个广泛应用的,从非标准扩展到标准的C语言.它不能被移植,因为它不是标准定义下的C语言,但是,编译器通常在一个不遵循程式标准的模式下允许其通过header ,因为它是一个从逻辑对应到标准库的函数.itoa 取整数输入值,并将其转换为相应进制数字的字符串. 用法: itoa(i ,num ,10 ); i ---- 需要转换成字符串的数字 num ---- 转换后保存字符串的变量 10 ---- 转换数字的基数(即进制).10就是说按10

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): return x**2 y=func(10) print(y) def foo(): return None res=foo() print(res) def foo(): return{'a':1} res=foo() print(res['a']) def foo(): return {'a':1},1,'a',[1,2] res=foo() p

javascript学习笔记(二):定义函数、调用函数、参数、返回值、局部和全局变量

定义函数.调用函数.参数.返回值 关键字function定义函数,格式如下: function 函数名(){ 函数体 } 调用函数.参数.返回值的规则和c语言规则类似. 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta chaset="UTF-8"> 5 <title></title> 6 </head> 7 <body