南华寺门票团购: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:输入你所带的参数。