① ShellExecute函数
下面的大部分信息来自于MSDN。
函数原型:
HINSTANCE ShellExecute( HWND hwnd, //指定父窗体句柄
LPCTSTR lpOperation, //指定操作方式
LPCTSTR lpFile, //指定要操作的文件
LPCTSTR lpParameters, //参数
LPCTSTR lpDirectory, //缺省目录
INT nShowCmd
);
该函数的功能是“对指定的文件进行指定的操作”。参数说明:
lpOperation:操作方式,该方式以一个字符串的形式指定的,它代表可以对对象进行的操作,一般来说,它对应于对象的快捷菜单(这点不是很明白)。针对某个对象的操作,可以通过HKEY_CLASSES_ROOT CLSID {object_clsid} Shell verb注册表项来进行查看。一般来说,对消的操作有如下几种:
edit | 打开文档注册的编辑器来编辑文档,如果lpFile参数指定的不是文档,调用失败 |
find | 浏览lpFile指定的文件夹 |
open | 打开lpFile参数指定的文件,可以是可执行文件、文档、文件夹等 |
| 打印lpFile指定的文档,如果该参数指定的不是一个文档,则调用失败 |
explore | 使用资源管理器查看lpFile指定的文件夹 |
lpFile:指定一个文件或者一个对象来进行操作。全路径名。
lpParameters:如果lpFile指定的是一个可执行的文件,则该参数指定一个传递给可执行文件的参数。如果lpFile指定的是文档,则该参数为NULL
nShowCmd:该参数指定应用程序打开时以何种方式显示;当lpFile指定的是一个文档时,该参数简单的传递给相关的应用程序,应用程序到底怎么显示,则要依赖于应用程序是如何处理这些参数的。
返回值:如果返回的值大于32,则表示函数成功执行,如果小于或等于32,则表示出错。不过,为了和16位程序兼容,该函数的返回值是HINSTANCE,在32位程序中,可以直接把它转化成int来进行处理。下面列出该函数返回的错误值:
0 | The operating system is out of memory or resources. |
ERROR_FILE_NOT_FOUND | The specified file was not found. |
ERROR_PATH_NOT_FOUND | The specified path was not found. |
ERROR_BAD_FORMAT | The .exe file is invalid (non-Microsoft Win32® .exe or error in .exe image). |
SE_ERR_ACCESSDENIED | The operating system denied access to the specified file. |
SE_ERR_ASSOCINCOMPLETE | The file name association is incomplete or invalid. |
SE_ERR_DDEBUSY | The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed. |
SE_ERR_DDEFAIL | The DDE transaction failed. |
SE_ERR_DDETIMEOUT | The DDE transaction could not be completed because the request timed out. |
SE_ERR_DLLNOTFOUND | The specified dynamic-link library (DLL) was not found. |
SE_ERR_FNF | The specified file was not found. |
SE_ERR_NOASSOC | There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable. |
SE_ERR_OOM | There was not enough memory to complete the operation. |
SE_ERR_PNF | The specified path was not found. |
SE_ERR_SHARE | A sharing violation occurred. |
下面,针对该函数的使用,举几个例子以作说明:
l 打开计算器或者写字板程序
ShellExecute ( this->GetSafeHandle(), “open” , “calc.exe”, NULL, NULL, SW_SHOW );
ShellExecute ( this->GetSafeHandle(), NULL , “calc.exe”, NULL, NULL, SW_SHOW ); ShellExecute ( this->GetSafeHandle(), “open”, “notepad.exe”, NULL, NULL, SW_SHOW );
ShellExecute ( this->GetSafeHandle(), NULL , “notepad.exe”, NULL, NULL, SW_SHOW );
l 打开一个文档,如果该文档有对应的编辑器,则该编辑器会被自动打开。如果指定的文档没有对应的编辑器,则函数调用失败。
ShellExecute ( this->GetSafeHwnd (), "open", "G: a b.doc", NULL, NULL, SW_SHOW );
ShellExecute ( this->GetSafeHwnd (),"open","G: a b.txt",NULL,NULL, SW_MINIMIZE );
l 打开一个网页,事实上,打开一个网页和打开一个文档是一样的
ShellExecute ( this->GetSafeHwnd (), "open", "http://www.sohu.com" , NULL, NULL, SW_SHOW );
ShellExecute ( this->GetSafeHwnd (), "open", "www.sohu.com" , NULL, NULL, SW_SHOW );
l 调用邮件发送程序,发送邮件
ShellExecute ( this->GetSafeHwnd (), "open", "mailto:henan_lujun@163.com",
NULL, NULL, SW_SHOW );
l 浏览某个文件夹的内容
ShellExecute ( this->GetSafeHwnd (), "explore", "G: ", NULL, NULL, SW_SHOW );
l 加载查找工具,其中lpFile参数指定查找的范围
ShellExecute ( this->GetSafeHwnd (), "find", "G: a ",NULL,NULL, SW_SHOW );
l 打印一个文档,调用对应文档的打印程序来实现
ShellExecute ( this->GetSafeHwnd (), "print", "b.txt",NULL,"G: a ", SW_SHOW );
ShellExecute ( this->GetSafeHwnd (), " G: a print", "b.txt",NULL,NULL, SW_SHOW );
② ShellExecuteEx函数
上述的ShellExecute方法,不能获得所开启的应用程序的相关信息,为此,Windows提供了ShellExecuteEx函数,使用该函数可以获得启动程序的相关信息,例如进程句柄、图标等。
原型:
BOOL ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo
);
lpExecInfo:是一个指向SHELLEXECUTEINFO的结构,该结构记录了相关的输入信息以及该函数所启动的应用程序的一些信息。关于该结构的详细说明,参见MSDN。下面举例说明该函数的使用方法。
l 打开一个文档,并在10秒后强制结束该进程
SHELLEXECUTEINFO shellinfo;
ZeroMemory ( &shellinfo, sizeof ( shellinfo ) ); shellinfo.cbSize = sizeof ( shellinfo ); shellinfo.fMask = SEE_MASK_NOCLOSEPROCESS; shellinfo.hwnd = this->GetSafeHwnd (); shellinfo.lpVerb = "edit"; shellinfo.lpFile = "b.doc"; shellinfo.lpParameters = NULL; shellinfo.lpDirectory = "G: a "; shellinfo.nShow = SW_SHOW;
ShellExecuteEx ( &shellinfo ); _sleep ( 10000 ); TerminateProcess ( shellinfo.hProcess, 0 ); |
l 等待创建的进程结束。只需对上面的代码稍作修改
…… ShellExecuteEx ( &shellinfo ); //线程对象或者进程对象在结束时变为激发态 WaitForSingleObject ( shellinfo.hProcess, INFINITE ); MessageBox ( "进程结束" ); …… |
l 显示文件或者文件夹的属性对话框
SHELLEXECUTEINFO shellinfo; ZeroMemory ( &shellinfo, sizeof ( shellinfo ) ); shellinfo.cbSize = sizeof ( shellinfo ); shellinfo.fMask = SEE_MASK_INVOKEIDLIST ; //该Flag必须指定 shellinfo.hwnd = this->GetSafeHwnd (); shellinfo.lpVerb = "properties"; shellinfo.lpFile = "G: a b.doc"; //显示文件属性 shellinfo.lpFile = "G: a" ; //显示文件夹属性 shellinfo.lpParameters = NULL; shellinfo.lpDirectory = NULL; shellinfo.nShow = SW_SHOW; ShellExecuteEx ( &shellinfo );
|
l
-
选择文件打开方式对话框
…… shellinfo.lpVerb = "openas"; …… |
l 使用ACDSee扩展的操作。例如在装了ACDsee7.0 的系统中,当使用:
shellinfo.lpVerb = "acdprint"; shellinfo.lpFile = "G: a b.bmp"; |
调用ShellExecuteEx时,会出现ACDSee的打印对话框。
关于如何对文件对象添加操作及如何扩展右键菜单,尚没弄明白,具体信息可参看MSDN:ms-help://MS.MSDNQTR.2003FEB.2052/shellcc/platform/shell/programmersguide/shell_int/shell_int_extending/extensionhandlers/contextmenuhandlers.htm
③ CreateProcess函数
该函数创建一个进程,并返回关于新进程足够多的信息。其函数原型如下:
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
关于该函数的参数及返回值的详细说明,参见MSDN。其中最后一个参数返回了创建的新进程的相关信息,包括进程对象句柄、主线程对象句柄、进程ID及线程ID,使用这些信息,可以对新进程有足够多的控制。
④ WinExec函数
该函数的功能是启动另外一个应用程序。
MS认为,该函数是为了和16位Windows兼容而提供的,在新的程序中,应该使用CreateProcess函数来启动一个新的进程,但是在实际应用中,这个函数还是比较常见——因为它很简单。其原型如下:
UINT WinExec(
LPCSTR lpCmdLine,
UINT uCmdShow
);
注意,该函数只能打开应用程序,不能打开文档。例如WinExec(“C: a.txt”, SW_SHOW)将会调用失败。