2017.06.30—Visio Studio下MFC c++的入口程序(main函数)

来源:互联网 发布:相机数据恢复 编辑:程序博客网 时间:2024/06/06 20:11

这是自己总结的各个大神理解,感觉对自己有用的部分,就记下来了。

1.MFC 库已经封装了许多基础函数,在 InitInstance 函数中设置一个断点, F5运行停下来的时候,看调用堆栈, 就知道调用的层次了, 双击进去也可以看到源码;

2.MFC已经封装了,你这个有一个App实例,它的InitInstance就是你代码可以开始执行的入口
3. http://blog.csdn.net/gencheng/article/details/12676021      MFC框架中消失的WinMain()
4.http://blog.csdn.net/weiwenhp/article/details/8455471博客;
5.根据自己的理解,MFC c++下的main函数是WinMain,但是
// Advanced initialization: for overriding default WinMain
BOOL AFXAPI AfxWinInit(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
    _In_z_ LPTSTR lpCmdLine, _In_ int nCmdShow);
6.总结起来可以这样简单的说,MFC中有main函数,但是由系统去调用.然后main函数里面执行的操作差不多,只不过它是通过CWinApp和CWinThread的指针去调用一些相关的函数.而指针嘛由于调用了虚函数,所以用到了面向对象中的多态,于是转来转去的.然后最难的地方可能就是消息机制在这里更复杂一点了.不能简单的与SDK中做一对一的对比.
7.一般是BOOL XXXXApp::InitInstance()这里开始的;
8.mainCRTStartup等入口函数是编译器插入到程序中的crt初始化和清理函数,初始化的一个重要任务就是初始化crt堆,在此之前不能使用crt的分配内存函数。但这句并没有问题。每个进程启动时,系统会为它分配一个默认堆,API函数GetProcessHeap就是取得这个默认堆,而API函数HeapAlloc是从堆中分配内存。
posvi = (OSVERSIONINFOA *)HeapAlloc(GetProcessHeap(), 0, sizeof(OSVERSIONINFOA));
9.简单说:
(1)MFC用AfxWinMain代替了原来C编程中的WinMain();
(2)AfxWinMain()是MFC已经帮你写好了,并由Windows系统调用,不用你写了;
(3)在AfxWinMain()被执行之前,需要有了一个CWinApp类全局对象,由你自己建立;
(4)而CWinApp类是CWinThread类的派生类,而且当前的CWinApp类全局对象(这个对象有且只能有一个),然后Windows系统启动你的程序,调用AfxWinMain(),AfxWinMain()中通过调用全局函数AfxGetApp()来得到指向你建立的CWinApp对象的指针(MFC先编好的AfxWinMain()函数可以调用你自己后来建立的对象,这是C++的特性)。
这样MFC程序先建立应用程序对象,然后将内部准备好的WinMain()与之连接,执行一系列动作,从而使程序运行。
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
是消息映射,与WinMain无关,这两句是将ID_FILE_NEW和ID_FILE_OPEN两个句柄与创建新文件和打开文件函数关联。
10.
原创粉丝点击