MFC接收外部程序执行的shellexecute中传递的参数来执行不同操作

大家都知道,我们可以通过shellexecute函数来执行别人的程序,但如果别人的程序通过shellexecute来执行我们自己的程序,而且通过传递过来的参数来执行不现效果呢?

首先,来看看ShellExecute函数

使用该函数时,需添加该头文件:

#include

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

ShellExecute(

hWnd: HWND; {指定父窗口句柄}

Operation: PChar; {指定动作, 譬如: open、print、edit、explore、find}

FileName: PChar; {指定要打开的文件或程序}

Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil}

Directory: PChar; {缺省目录}

ShowCmd: Integer {打开选项}

): HINST;

ShowCmd 参数可选值:SW_HIDE = 0; {隐藏}

SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活}

SW_NORMAL = 1; {同 SW_SHOWNORMAL}

SW_SHOWMINIMIZED = 2; {最小化, 激活}

SW_SHOWMAXIMIZED = 3; {最大化, 激活}

SW_MAXIMIZE = 3; {同 SW_SHOWMAXIMIZED}

SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活}

SW_SHOW = 5; {同 SW_SHOWNORMAL}

SW_MINIMIZE = 6; {最小化, 不激活}

SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}

SW_SHOWNA = 8; {同 SW_SHOWNOACTIVATE}

SW_RESTORE = 9; {同 SW_SHOWNORMAL}

SW_SHOWDEFAULT = 10; {同 SW_SHOWNORMAL}

SW_MAX = 10; {同 SW_SHOWNORMAL}

别人通过 ShellExecute执行我们的程序时, 我们可以根据第四个参数 Parameters根据需求来执行不同效果。

MFC中,InitInstance函数是整个程序的入口,所以我们可以在这里捕获Parameters函数,实际相当于main中的第二个参数

在这里举例说明,假如Parameters传递值程序执行的效果如下

“1”   --  启动程序

“2”-- 关闭程序

“3”-- 最小化窗口

“4,5,6” -- 保存接收到的数据

通过

BOOL CMytestApp::InitInstance()

{

CString sParameter

for (int i = 1; i < __argc; i++)
{
sParameter+= __argv[i];
}

/*******************************/

下面这段可以根据要求来处理

/************************/

}

如果程序已经运行,把这些参数传递给正在运行的参数。

注意第一次进行InitInstance进来启动程序时,已经创建了一个实例,当第二次进来时,不是直接调用ShowWindow(SW_SHOW),因为这个ShowWindow对应的CWND是当前正在启动的实例的句柄,我们可以通过

CWnd *pWnd = CWnd::FindWindow( NULL, "Myest" );
if ( pWnd != NULL )//找到句柄来发送消息
{
pWnd->SendMessage( WM_SHOW, NULL, NULL );
}

也可以自定义消息来发送,当前运行的程序来根据不同消息来响应操作

如果有自定义一个 WM_WRITE_DATA消息,对应函数writedata()函数,切不可直接

pWnd->writedata();调用,你会发现根本就编译不过,而是通过

pWnd->SendMessage(WM_WRITE_DATA, NULL, NULL );来调用函数


总结:特别要注意的一点是,第二次进入InitInstance时,已经是第二个实例进程,当定义了全局变量,

不能通过变量直接赋值来认为改变了第一个实例的值,或者直接通过调用函数来认为调用了第一个实例的进程,

一定要FindWindow找到第一个实例的句柄,再通过发送消息来处理。

你可能感兴趣的:(VC学习)