C++调用外部应用程序的方法的整理总结
一、三个SDK函数:
WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
WinExec 两个参数,前一个指定路径,后一个指定显示方式。
ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。
1.winexec(String lpCmdLine,Long nCmdShow);
参数说明:
参数 | 类型及说明 |
lpCmdLine | String,包含要执行的命令行 |
nCmdShow | Long,为窗口指定可视性方面的一个命令。请用下述任何一个常数 | |
SW_HIDE | 隐藏窗口,活动状态给令一个窗口 | |
SW_MINIMIZE | 最小化窗口,活动状态给令一个窗口 | |
SW_RESTORE | 用原来的大小和位置显示一个窗口,同时令其进入活动状态 | |
SW_SHOW | 用当前的大小和位置显示一个窗口,同时令其进入活动状态 | |
SW_SHOWMAXIMIZED | 最大化窗口,并将其激活 | |
SW_SHOWMINIMIZED | 最小化窗口,并将其激活 | |
SW_SHOWMINNOACTIVE | 最小化一个窗口,同时不改变活动窗口 | |
SW_SHOWNA | 用当前的大小和位置显示一个窗口,不改变活动窗口 | |
SW_SHOWNOACTIVATE | 用最近的大小和位置显示一个窗口,同时不改变活动窗口 | |
SW_SHOWNORMAL | 与SW_RESTORE相同 |
例: winexec("c:\\a.txt",SW_SHOW);
2.ShellExecute
参数 | 类型及说明 |
hwnd | Long,指定一个窗口的句柄,有时候,windows程序有必要在创建自己的主窗口前显示一个消息框 |
lpOperation | String,指定字串“open”来打开lpFlie文档,或指定“Print”来打印它 |
lpFile | String,想用关联程序打印或打开一个程序名或文件名 |
lpParameters | String,如lpszFlie是可执行文件,则这个字串包含传递给执行程序的参数 |
lpDirectory | String,想使用的完整路径 |
nShowCmd | Long,定义了如何显示启动程序的常数值。参考上表. |
使用方法如下:
例:ShellExecute(Handle, ''open'', PChar(''c:\test\readme.txt''), nil, nil, SW_SHOW);
ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:/Test.txt 文件
ShellExecute(NULL, "open", "http://www.zzzyk.com",/ NULL, NULL, SW_SHOWNORMAL); // 打开网页www.zzzyk.com
ShellExecute(NULL,"explore", "D://C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:/C++
ShellExecute(NULL,"print","C://Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:/Test.txt
3.CreateProcess
参数类型及说明lpApplicationNameString,要执行的应用程序的名字。可设为vbNullString;在这种情况下,应用程序的名字应在lpCommandLine参数的起始处出现lpCommandLineString,要执行的命令行。可用GetCommandLine函数取得一个进程使用的命令行。Windows会尽可能地根据下述搜索顺序来查找执行文件:
(1)包含了父进程执行文件的目录
(2)父进程当前的目录
(3)由GetSystemDirectory返回的系统目录
(4)仅适于windows NT:16位系统目录
(5)由GetWindowDirectory返回的Windows目录
(6)由PATH环境变量指定的目录lpProcessAttributesSECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了进程的安全特性lpThreadAttributesSECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值)——表示采用不允许继承的默认描述符。该参数定义了进程之主线程的安全特性bInheritHandlesLong,TRUE表示允许当前进程中的所有句柄都由新建的子进程继承dwCreationFlagsLong,来自API32.TXT文件的一个或多个下述常数之一,它们都带有前缀CREATE_。下面这些用于VB程序员:CREATE_SEPARATE_WOW_VDM(仅适用于NT)启动一个16位的Windows应用程序时,易做图它在自己的内存空间运行CREATE_SHARED_WOW_VDM(仅适用于NT)启动一个16位的Windows应用程序时,易做图它在共享的16位虚拟机(VM)内运行CREATE_SUSPENDED立即挂起新进程。除非调用了ResumeThread函数函数,否则它不会恢复运行也可能是下述常数之一,用于指定优先级IDLE_PRIORITY_CLASS新进程应该有非常低的优先级——只有在系统空闲的时候才能运行。基本值是4HIGH_PRIORITY_CLASS新进程有非常高的优先级,它优先于大多数应用程序。基本值是13。注意尽量避免采用这个优先级NORMAL_PRIORITY_CLASS标准优先级。如进程位于前台,则基本值是9;如在后台,则优先值是7不要在VB中使用REALTIME_PRIORITY_CLASSlpEnvironmentAny,指向一个环境块的指针(环境缓冲区的头一个字符,或者环境块的地址)lpCurrentDriectoryString,新进程的当前目录路径。调用函数的时候,可用vbNullString指定当前目录lpStartupInfoSTARTUPINFO,指定一个STARTUPINFO结构,其中包含了创建进程时使用的附加信息lpProcessInformation
PROCESS_INFORMATION,该结构用于容纳新进程的进程和线程标识符。大多数情况下,一旦这个函数返回,父应用程序都会关闭两个句柄。
二、WinExec、ShellExecute和CreateProcess及返回值判断方式
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为使用复杂,比较少用。
WinExec主要运行EXE文件。
⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);
⑵ 参数:
lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。
uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。
⑶ 返回值:
若函数调用成功,则返回值大于31。若函数调用失败,则返回值为下列之一:
① 0:系统内存或资源已耗尽。
② ERROR_BAD_FORMAT:EXE文件无效(非Win32.EXE或.EXE影像错误)。
③ ERROR_FILE_NOT_FOUND:指定的文件未找到。
④ ERROR_PATH_NOT_FOUND:指定的路径未找到。
虽然Microsoft认为WinExec已过时,但是在许多时候,简单的WinExec函数仍是运行新程序的最好方式。简单地传送作为第一个参数的 命令行,还需要决定如何显示程序(该程序也许会忽视它)的第二个参数。通常,将其设置为SW_SHOW,也可尝试SW_MINIMIZED或 SW_MAXIMIZED。WinExec不允许用CreateProcess获得的所有选项,而它的确简单。
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。
1、标准用法
ShellExecute函数原型及参数含义如下:
HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);
●hWn
补充:软件开发 , C++ ,