MFC程序运行流程

->进入入口函数_tWinMain()


程序首先进入文件AppModul.cpp,找到_tWinMain()函数运行,调用其中的AfxWinMain()函数。

由于为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版.对UNICODE版的程序,C运行库将调用wWinMain,而对于ANSI版的应用,则调用WinMain.

MFC的代码设计时是自动支持UNICODE的,所以,MFC的WinMain在APPMODUL.CPP被定义为_tWinMain(HINSTANCE
hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow),无论用户#define
_UNICODE与否,MFC的WinMain都会被调用.

?





1

2

3

4

5

6

7

8

extern
"C" int WINAPI

_tWinMain(HINSTANCE
hInstance, HINSTANCE
hPrevInstance,

    _In_ LPTSTR
lpCmdLine, int
nCmdShow)

#pragma warning(suppress: 4985)

{

    // call shared/exported WinMain

    return
AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

}

hInstance:表示该程序当前运行的实例句柄,它是一个数值。当程序在Windows下运行时,它唯一标识运行中的实例。

hPrevInstance:父窗口句柄。这个参数在Win32下已经不起作用了。

lpCmpLine:指定传递给应用程序的命令行参数。

nCmdShow:指定程序窗口如何显示,例如最大化、最小化、隐藏等。

->进入AfxWinMain()

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

int AFXAPI AfxWinMain(HINSTANCE
hInstance, HINSTANCE
hPrevInstance,

    _In_ LPTSTR
lpCmdLine, int
nCmdShow)

{

    ASSERT(hPrevInstance == NULL);

    int
nReturnCode = -1;

    CWinThread* pThread = AfxGetThread();//返回指向theApp的指针

    CWinApp* pApp = AfxGetApp();//返回指向theApp的指针

    // AFX internal initialization

    if
(!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))//初始化应用程序内部环境,设置MFC

        goto
InitFailure;

    // App global initializations (rare)

    if
(pApp != NULL && !pApp->InitApplication())//初始化应用程序内部环境,设置MFC

        goto
InitFailure;

    // Perform specific initializations

    if
(!pThread->InitInstance())//完成应用程序相关工作:设计窗口类、注册窗口类、创建窗口类、显示窗口类、更新窗口类

    {

        if
(pThread->m_pMainWnd != NULL)

        {

            TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");

            pThread->m_pMainWnd->DestroyWindow();

        }

        nReturnCode = pThread->ExitInstance();

        goto
InitFailure;

    }

    nReturnCode = pThread->Run();//进入消息循环,处理系统消息。

InitFailure:

#ifdef _DEBUG

    // Check for missing AfxLockTempMap calls

    if
(AfxGetModuleThreadState()->m_nTempMapLock != 0)

    {

        TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n",

            AfxGetModuleThreadState()->m_nTempMapLock);

    }

    AfxLockTempMaps();

    AfxUnlockTempMaps(-1);

#endif

    AfxWinTerm();

    return
nReturnCode;

}

->pThread->InitInstance()


这是个虚函数,pThread指向的是theApp,调用的是子类C***App类中的InitInstance函数。

KuaiPaiClient项目中的该函数为:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

BOOL
CKuaiPanClientApp::InitInstance()

{

    // InitCommonControlsEx() is required on Windows XP if an application

    // manifest specifies use of ComCtl32.dll version 6 or later to enable

    // visual styles.  Otherwise, any window creation will fail.

    INITCOMMONCONTROLSEX InitCtrls;

    InitCtrls.dwSize = sizeof(InitCtrls);

    // Set this to include all the common control classes you want to use

    // in your application.

    InitCtrls.dwICC = ICC_WIN95_CLASSES;

    InitCommonControlsEx(&InitCtrls);

    CWinAppEx::InitInstance();

    // Initialize OLE libraries

    if
(!AfxOleInit())

    {

        AfxMessageBox(IDP_OLE_INIT_FAILED);

        return
FALSE;

    }

    AfxEnableControlContainer();

    EnableTaskbarInteraction(FALSE);

    // AfxInitRichEdit2() is required to use RichEdit control  

    // AfxInitRichEdit2();

    // Standard initialization

    // If you are not using these features and wish to reduce the size

    // of your final executable, you should remove from the following

    // the specific initialization routines you do not need

    // Change the registry key under which our settings are stored

    // TODO: You should modify this string to be something appropriate

    // such as the name of your company or organization

    SetRegistryKey(_T("Local AppWizard-Generated Applications"));

    LoadStdProfileSettings(4);  // Load standard INI file options (including MRU)

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

    InitContextMenuManager();

    InitKeyboardManager();

    InitTooltipManager();

    CMFCToolTipInfo ttParams;

    ttParams.m_bVislManagerTheme = TRUE;

    theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,

        RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);

    // Register the application‘s document templates.  Document templates

    //  serve as the connection between documents, frame windows and views

    CSingleDocTemplate* pDocTemplate;

    pDocTemplate = new
CSingleDocTemplate(

        IDR_MAINFRAME,

        RUNTIME_CLASS(CKuaiPanClientDoc),

        RUNTIME_CLASS(CMainFrame),       // main SDI frame window

        RUNTIME_CLASS(CKuaiPanClientView));

    if
(!pDocTemplate)

        return
FALSE;

    AddDocTemplate(pDocTemplate);//将Doc类、CMainFrame和CView三个类用文档模板关联到一起,装载到当前应用程序的全局对象theApp中。

    // Parse command line for standard shell commands, DDE, file open

    CCommandLineInfo cmdInfo;

    ParseCommandLine(cmdInfo);

    // Dispatch commands specified on the command line.  Will return FALSE if

    // app was launched with /RegServer, /Register, /Unregserver or /Unregister.

    if
(!ProcessShellCommand(cmdInfo))

        return
FALSE;

    // The one and only window has been initialized, so show and update it

    m_pMainWnd->ShowWindow(SW_SHOW);

    m_pMainWnd->UpdateWindow();

    // call DragAcceptFiles only if there‘s a suffix

    //  In an SDI app, this should occur after ProcessShellCommand

    return
TRUE;

}

时间: 2024-10-17 02:45:27

MFC程序运行流程的相关文章

IOS学习笔记1—Iphone程序运行流程

Iphone程序运行流程 main.m文件,iOS应用程序的主入口 main函数的两个参数为命令行参数,在ios开发中不会用到这些元素,包括这两个参数是为了与标准ANSI C保持一致 UIApplicationMain函数: 为应用程序提供主入口点,创建新的应用程序实例和它的委托.委托负责处理应用程序状态变更,并为那些变更提供响应 启动和加载窗口后,应用程序委托退居幕后,几乎所有应用程序语义都转到UIViewController类的某个子类,应用程序委托通常不再发挥作用,除非应用程序将要结束,或

java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)

JAVA里面的程序运行流程分三大类: 1,顺序结构:顺序结构就是依次执行每一行代码 2,分支结构:分支结构就是按不同的条件进行分支 3,循环结构:一段代码依条件进行循环执行. 其中,分支结构有两大类: if...else...结构和switch...结构       switch中的case支持的数据类型只有四种:    char  (字符型)    byte  (比特型)    short (短整型)    int     (整型) 注意switch里面的判断语句后面需要加break,否则的话

Python程序运行流程与垃圾回收机制

Python程序运行流程 Python解释器首先将程序将py文件编译成一个字节码对象PyCodeObject(只存在于内存中).(当这个模块的 Python 代码执行完后,就会将编译结果保存到了pyc文件中,这样下次就不用编译,直接加载到内存中.pyc文件只是PyCodeObject对象在硬盘上的表现形式.) py文件被编译后,接下来的工作就交由 Python虚拟机来执行字节码指令.Python虚拟机会从编译得到的PyCodeObject对象中依次读入每一条字节码指令,并在当前的上下文环境中执行

我的全栈之路-C语言基础之C程序运行流程

我的全栈之路-C语言基础之C程序运行流程 我的全栈之路 4.1 C程序的运行流程 C语言编写的程序一般都要经过编写源文件->预处理->编译->汇编->链接后运行这几个流程. 预处理 预处理主要是宏替换.包含头文件.条件编译以及删除注释等操作,预编译阶段生成文件的后缀名通常是.i. 编译 编译主要是将预处理好的文件生成汇编文件,编译后文件的后缀名通常是.s. 汇编 汇编主要是将汇编文件生成二进制文件,汇编后的文件的后缀名通常是.o. 链接 链接主要是将各个二进制文件.库函数.启动代码

2.4 Android程序运行流程

我们还是得给大家介绍一下Android程序是如何运行,了解它的运行流程非常重要.我们以图解的形式来描述这样子显得更加直观. 文字内容来自:国信安刘阳

自定义控件程序运行流程

1.自定义控件 1.1 CHDataView.h // // 文 件 名:CHDataView.h // // 版权所有:Copyright ? 2018年 Lelight. All rights reserved. // 创 建 者:leLight // 创建日期:2018/8/4. // 文档说明: // 修 改 人: // 修改日期: // #import <Foundation/Foundation.h> @interface CHDataView : UIView /** 数据模型

逆向第三课(深入.NET程序运行原理)

注:本文适用读者范围,对Windows下的PE文件有一定认识的朋友 一. 名词解释 a)        CLR: 公共语言运行时(Common LanguageRuntime),CLR时.NET框架的核心内容之一,可以把它看为一套标准资源,可以被任何.NET程序使用.它包括:面向对象的编程模型.安全模型.类型系统(CTS).所有.NET基类.程序执行以及代码管理等. b)        JIT: 即时编译(Just In-Time compile),这是.NET运行可执行程序的基本方式,也就是在

MFC 程序入口和执行流程

一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程序当中我们不在能找到类似WinMain这样的程序入口,取而代之的是一系列派生类的声明和定义以及一个冲CWinApp类派生而来的类的全局对象.CWinApp类被称之为应用程序对象,在一个MFC程序当中只允许有一个应用程序对象.由于CWinApp的派生对象是全局的,因此这个对

深入跟踪MFC程序的执行流程

来源: http://blog.csdn.net/ljianhui/article/details/8781991 在MFC程序设计的学习过程中最令人感到难受,甚至于有时会动摇学习者信心的就是一种对于程序的一切细节都没有控制权的感觉.这种感觉来源于学习者不知道一个MFC程序是如何运行起来的(即一个MFC程序的执行流程)和MFC程序的设计思想和机制,即使是写过Windows程序的学习者,也会感到非常迷惘并且无从下手.而这种感觉的出现会使大家认为自己离开了书本上的例子就无法设计编制程序.下面我就来说