MFC启动其它应用程序的方法

2011-01-16 20:50:59|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, MFC|来源:唯设编程网

大多数时候,我们需要在一个应用程序中打开另外的应用程序,本文总结了3中MFC启动外部程序方法:

1、Winexec

  这个函数最简单,只有两个参数,原型如下:

UINT WinExec(
             LPCSTR lpCmdLine, // address of command line
             UINT uCmdShow // window style for new application
             );

  使用方法如下:

 WinExec(_T("D:Program Fileszeecallszeecalls.exe"),SW_SHOWMAXIMIZED);

  这句话将会以最大化的方式打开zeecalls.exe,需要注意的是,在VC中,‘’是一个转义字符,需要以'’来写。

2、CreateProcess

  上面的几种方式都实现了我们在自己的应用程序中打开其他的应用程序的目的,但是,我们没有得到足够多的关于新的进程的信息,也没有使用过多的手段去控制新 的进程的细节属性,所以,如果要达到这些目的,我们就需要使用CreateProcess函数了,首先看看这个函数的原型:

BOOL CreateProcess(
                   LPCTSTR lpApplicationName, //执行程序名
                   LPTSTR lpCommandLine, // 参数行
                   //下面两个参数描述了所创建的进程和线程的安全属性,
                   //如果为NULL则使用默认的安全属性
                   LPSECURITY_ATTRIBUTES lpProcessAttributes, 
                   // process security attributes
                   LPSECURITY_ATTRIBUTES lpThreadAttributes,
                   // thread security attributes
                   BOOL bInheritHandles, 
                   // 继承标志
                   DWORD dwCreationFlags, 
                   // 创建标志
                   LPVOID lpEnvironment, 
                   // 环境变量
                   LPCTSTR lpCurrentDirectory, 
                   // 运行该进程的初始目录
                   LPSTARTUPINFO lpStartupInfo,
                   // 用于在创建子进程时设置各种属性
                   LPPROCESS_INFORMATION lpProcessInformation 
                   //用于在进程创建后接受相关信息
                   );

  在上面的参数中,使用了两个比较重要的数据结构:STARTUPINFO和PROCESS_INFORMATION。这两个结构的定义分别如下:

typedef struct _STARTUPINFO { // si
    DWORD cb; //结构长度
    LPTSTR lpReserved; //保留
    LPTSTR lpDesktop; //保留
    LPTSTR lpTitle; //如果为控制台进程则为显示的标题
    DWORD dwX; //窗口横坐标
    DWORD dwY; //窗口丛坐标
    DWORD dwXSize; //窗口宽度
    DWORD dwYSize; //窗口高度
    DWORD dwXCountChars; //控制台窗口字符号宽度
    DWORD dwYCountChars; //控制台窗口字符号高度
    DWORD dwFillAttribute; //控制台窗口填充模式
    DWORD dwFlags; //创建标记
    WORD wShowWindow; //窗口显示标记,如同ShowWindow中的标记
    WORD cbReserved2; //保留参数
    LPBYTE lpReserved2; //保留参数
    HANDLE hStdInput; //标准输入句柄
    HANDLE hStdOutput; //标准输出句柄
    HANDLE hStdError; //标准错误句柄
} STARTUPINFO, *LPSTARTUPINFO;

typedef struct _PROCESS_INFORMATION { // pi
    HANDLE hProcess; //进程句柄
    HANDLE hThread; //进程的主线程句柄
    DWORD dwProcessId; //进程的ID
    DWORD dwThreadId; //进程的主线程ID
} PROCESS_INFORMATION;

 
  作为例子,我们来看看如何使用CreateProcess来打开相同的文件:

PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;

bool fRet=CreateProcess(
                        "D:Program Fileszeecallszeecalls.exe"
                        ,NULL
                        ,NULL
                        ,FALSE
                        ,NULL
                        ,NULL
                        ,NULL
                        ,NULL
                        ,&si
                        ,&pi
                        );

3.ShellExecute:

ShellExecute函数原型及参数含义如下:

ShellExecute(
             HWND hWnd,
             //父窗口句柄
             LPCSTR lpOperation,
             //操作类型
             LPCSTR lpFile,
             //要进行操作的文件或路径
             LPCSTR lpParameters,
             //当lpOperation为“explore”时指定要传递的参数,通常设为NULL
             LPCSTR lpDirectory,
             //指定默认目录,通常设为NULL
             INT nShowCmd
             //文件打开的方式,以通常方式还是最大化或最小化显示
             )

首先要包含头文件shellapi.h

#include <shellapi.h>

例子如下:

//调用计算器
ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL);
//调用记事本
ShellExecute(NULL,"open","NOTEPAD.EXE",NULL,NULL,SW_SHOWNORMAL);
//打开超链接
ShellExecute(hWnd,"open","http://hexun.com/kenshin2008",NULL,NULL,SW_SHOW);
//打开路径文件 PathName(文件路径)
ShellExecute(NULL,"open",PathName,NULL,NULL,SW_SHOWNORMAL);

●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函数的标准用法,下面将介绍它的特殊用法。

最后的那个参数 nShowCmd ,为窗口指定可视性方面的一个参数。
请用下述任何一个常数
SW_HIDE 隐藏窗口,激活另一窗口
SW_MINIMIZE 最小化窗口,激活另一窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,但不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同

  可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,以上几种方法可能有些会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!

发表评论0条 】
网友评论(共?条评论)..
MFC启动其它应用程序的方法