南华寺门票团购:mfc 带参数运行
来源:百度文库 编辑:偶看新闻 时间:2024/05/03 08:06:50
MFC程序带参数运行
下面的例子可以用来判断程序运行的时候是否使用了-c,-s或者-p选项,具体程序中大家可以按照例子做简单改动即可。
第一步:从CCommandLineInfo重载一个类CWzdCommandLineInfo,实现方式如下
#if !defined WZDCOMMANDLINEINFO_H
#define WZDCOMMANDLINEINFO_H
// WzdCommandLineInfo.h : header file
//////////////////////////////////////////////////////////////////////////
// CWzdCommandLineInfo window
class CWzdCommandLineInfo : public CCommandLineInfo
{
// Construction
public :
CWzdCommandLineInfo( ) ;
// Attributes
public:
BOOL m_bCFlag;
BOOL m_bSFlag;
BOOL m_bPFlag;
CString m_sArg;
// Operations
public:
void ParseParam(const TCHAR* pszParam,BOOL bFlag, BOOL bLast);
// Overrides
// Implementation
public:
virtual ~CWzdCommandLineInfo();
} ;
//////////////////////////////////////////////////////////////////////////
#endif
头文件结束,下面是CPP文件
// WzdCommandLineInfo.cpp : implementation file
//
#include "stdafx.h"
#include "WzdCommandLineInfo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////
// CWzdCommandLineInfo
CWzdCommandLineInfo::CWzdCommandLineInfo( )
{
m_bCFlag = FALSE ;
m_bSFlag = FALSE ;
m_bPFlag = FALSE;
m_sArg = _T(" ") ;
}
CWzdCommandLineInfo::~CWzdCommandLineInfo( )
{
}
//////////////////////////////////////////////////////////////////////////
void CWzdCommandLineInfo::ParseParam(const TCHAR* pszParam, BOOL bFlag,
BOOL bLast)
{
CString sArg(pszParam);
if (bFlag)
{
m_bCFlag = !sArg.CompareNoCase("c");
m_bSFlag = !sArg.CompareNoCase("s");
m_bPFlag = !sArg.CompareNoCase("p");
}
// m_strFileName gets the first nonflag name
else if (m_strFileName.IsEmpty())
{
m_sArg = sArg ;
}
CCommandLineInfo::ParseParam(pszParam, bFlag, bLast ) ;
}
第二步:在APP类中添加成员变量:
public:
CWzdCommandLineInfo m_cmdInfo;
第三步:在InitInstance()函数中修改如下代码
// Parse command line for standard shell commands, DDE, file open
ParseCommandLine(m_cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(m_cmdInfo))
return FALSE;
如此即可以在程序的其它地方通过AfxGetApp()->m_cmdInfo取得CWzdCommandLineInfo对象,然后通过判断起成员变量m_bCFlag等等就能知道是用哪个选项运行的了。
2008-07-08 17:23
来自
WinMain
函数功能:该函数被系统调用,作为一个32位应用程序的入口点。
函数原型:
intWINAPI WinMain(
HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow
);
参数;
hInstance:应用程序当前事例的句柄。
hPrelnstance:应用程序的先事例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32的位程序,该参数总为NULL。
如果需要检测另外一个事例是否已经存在,则使用CreateMutex函数创建一个独一无二的名字。即使互斥名已经存在,CreateMutex函数也是成功的,但是GetLastError函数将返回 ERROR_ALREADY_EXISTS,这就表明在应用程序中有另外一个事例存在,因为它首先创建了互斥名。
lpCmdLine:指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine。
第三个参数lpCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数。例如:在D盘下有一个sunxin.txt文件,当我们用鼠标双击这个文件时将启动记事本程序(notepad.exe),此时系统会将D:\sunxin.txt作为命令行参数传递给记事本程序的WinMain函数,记事本程序在得到这个文件的全路径名后,就在窗口中显示该文件的内容。要在VC++开发环境中向应用程序传递参数,可以单击菜单【Project】→【Settings】,选择“Debug”选项卡,在“Program arguments”编辑框中输入你想传递给应用程序的参数。
nCmdShow:指明窗口如何显示。该参数可以是下列值之一:
SW_HIOE:隐藏窗口并且激活另外一个窗口。
SW_MINIMIZE:最小化指定的窗口,并且激活在系统表中的顶层窗口。
SW_RESTORE:激活并显示窗口。如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。
SW_SHOW:激活一个窗口并以原来的尺寸和位置显示窗口。
SW_SHOWMAXIMIZED:激活窗口并且将其最大化。
SW_SHOWMINIMIZED:激活窗口并将其目标化。
SW_SHOWMINNOACTIVE:将一个窗口显示为图标。激活窗口维持活动状态。
SW_SHOWNA:以窗口的当前状态显示窗口。激活窗口保持活动状态。
SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置显示窗口。激活窗口维持激活状态。
SW_SHOWNORMAL:激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)。
返回值:如果函数成功,当它接收到一个WM_QUIT消息时就中止,函数应该返回在该消息的wParam参数的退出值。如果函数在进入消息循环时退出,应该返回零。
备注:WinMain函数应初始化应用程序,显示主窗口,进入一个消息接收一发送循环,这个循环是应用程序执行的其余部分的顶级控制结构。当接收到一个WM_QUIT消息时,程序就中止。这时,WinMain函数应退出应用程序,并且返回传递给WM_QUIT消息的wParam参数的值。如果由于调用PostQuitMessage函数而接收到WM_QUIT消息,wParam的值是PostQuiMessage函数的nExitCode的值。请参看“创建一个窗口循环”。
ANSI应用程序可以使用WinMain函数的lpCmdLine参数进入命令行字符串(除了程序名之外)。WinMain不能返回Unicode字符串的原因是IpCmdLine使用的是LPSTR数据类型,而不是LPTSTR类型。GetCommandLine函数可以用于进入命令行的Unicode字符串,因为它使用的是LPTSTR类型。
WindowsCE:Windows CE不支持下列 nCmdLine参数值:
SW_MINIMIZE;SW_RESTORE;SW_RESTORE;SW_SHOWMAXMIZED
SW_SHOWMINIMIZED;SW_SHOWMINNOACTIVE
速查:WindowsNT:3.1以上版本;Windows:95以上版本:WindowsCE:1.0以上版本;头文件:Winbase.h库文件:用户自定义。
一 .MFC 中获取命令行参数的几种方法
下面转载自 http://www.qingfengju.com/article.asp?id=92
及http://blog.csdn.net/geeeeeeee/archive/
在MFC程序中,可以用以下几种方法来获取命令行参数。
为方便说明,我们假设执行了命令: C:\test\app.exe-1 -2
方法一
::GetCommandLine ();
将获取到 "C:\test\app.exe" -1 -2
方法二
for (int i=0;i<__argc ;i++)
{
__argv [i];
将依次得到 C:\test\app.exe -1 -2
}
方法三
AfxGetApp ()->m_lpCmdLine;
将获取到 -1-2
二。 MFC 中处理命令行的类
类CCommandLineInfo用于分析启动应用时的命令行参数。MFC应用一般都会在它的应用对象中使用函数InitInstance创建这个类的一个本地实例。然后把该对象传给CWinApp::ParseCommandLine,ParseCommandLine又重复调用ParseParam填充CCommandLineInfo对象。最后,CCommandLineInfo对象被传给CWinApp::ProcessShellCommand来处理命令行参数和选项。
viewplaincopy toclipboardprint?
1. 1. BOOL CExampleApp::InitInstance()
2. 2. {
3. 3. ...
4. 4. // 分析标准外壳命令、DDE、打开文件操作的命令行
5. 5. CCommandLineInfo cmdInfo;
6. 6. ParseCommandLine(cmdInfo);
7. 7.
8. 8.
9. 9. // 调度在命令行中指定的命令。如果
10. 10. // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
11. 11. if (!ProcessShellCommand(cmdInfo))
12. 12. return FALSE;
13. 13. ...
14. 14. }
15. 15.
16. 16.
17. 17. void CWinApp::ParseCommandLine(CCommandLineInfo& rCmdInfo)
18. 18. {
19. 19. for (int i = 1; i < __argc; i++)
20. 20. {
21. 21. LPCTSTR pszParam = __targv[i];
22. 22. BOOL bFlag = FALSE;
23. 23. BOOL bLast = ((i + 1) == __argc);
24. 24. if (pszParam[0] == '-' || pszParam[0] == '/')
25. 25. {
26. 26. // remove flag specifier
27. 27. bFlag = TRUE;
28. 28. ++pszParam;
29. 29. }
30. 30. rCmdInfo.ParseParam(pszParam, bFlag, bLast);
31. 31. }
32. 32. }
延伸:继承CCommandLineInfo类的例子 http://blog.csdn.net/birdme007/archive/2007/04/11/1560420.aspx
这篇文章用代码分析了CCommandLineInfo http://blog.csdn.net/wangandy7811/archive/2008/12/31/3663447.aspx
三 . 用 vc++ 调试带命令行的程序
在project--> setting-->debug-->Program arguments:输入你所带的参数。