标签:路径 tst trre 地址 htm aik details 17. 最大
1.AfxWinMain
首先,MFC程序先执行到TheApp实例化对象也就是通过这句CTestApp the App来实例化对象的
然后,调用CTestApp构造函数分配内存空间
然后,就调用了AfxWinMain函数(这个是MFC/SRC下的源码,安装软件后电脑上会有,跟踪也会跟踪的到)
然后,AfxWinMain指向AfxWinInit()函数
然后,AfxWinMain执行InitApplication,这个地方InitApplication是虚函数,调用的是CWinApp::InitApplication
然后,AfxWinMain指向InitInstance,在这里面调用了CTestFrameWnd的构造函数,产生了主窗口
然后,显示窗口,更新窗口发送标准消息WM_PAINT
最后回到AfxWinMain,执行run函数,进入消息循环
参考:https://zhidao.baidu.com/question/321228915.html
2. 参见:https://zhidao.baidu.com/question/421099954.html?qbl=relate_question_0&word=lpCmdLine
extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow);
其中各个参数:
HINSTANCE hInstance, HINSTANCE 是“句柄型”数据类型。相当于装入到了内存的资源的ID。HINSTANCE对应的资源是instance.句柄实际上是一个 无符号长整数。
HINSTANCE hPrevInstance
LPTSTR lpCmdLine 表示指向字符/字符串的指针。
int nCmdShow nCmdShow:指定窗口如何显示。如果发送应用程序的程序提供了STARTUPINFO结构,则应用程序第一次调用ShowWindow时该参数被忽略。否则,在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow参数。
更多内容参见:https://zhidao.baidu.com/question/206037460.html
3.CWinThread
CWinThread类是MFC用来封装线程的,包括UI线程和工作者线程。因此每个MFC程序至少使用一个CWinThread派生类。被MFC程序员熟知的CWinApp应用类就从这里派生。
参见:https://baike.baidu.com/item/CWinThread/5902501?fr=aladdin
4.CWinApp 是从 CWinThread 派生的,后者表示可能具有一个或多个线程的应用程序的主执行线程。
5.对应的:AfxGetThread函数与AfxGetApp函数
AfxGetApp是取前theApp的指针。
AfxGetThread是返回的是当前界面线程对象的指针,指得当前线程指针,如果在多线程时调用AfxGetThread返回的与AfxGetApp并不一定相同。
6.AfxWinInit
参数
BOOL AFXAPI AfxWinInit( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow );
BOOL CWinApp::InitApplication() { if (CDocManager::pStaticDocManager != NULL) { if (m_pDocManager == NULL) m_pDocManager = CDocManager::pStaticDocManager; CDocManager::pStaticDocManager = NULL; } if (m_pDocManager != NULL) m_pDocManager->AddDocTemplate(NULL); else CDocManager::bStaticInit = FALSE; LoadSysPolicies(); return TRUE; }
8.InitInstance 线程初始化
进入程序,InitInstance是虚函数,继承类必须提供它的实现代码。完成整个消息链的启动。
在CWinApp这个类中除了有一般类都有的构造函数,一个重要的成员函数就是InitInstance,我们知道,在WINDOWS环境下面可以运行同一程序的多个实例,函数InitInstance的作用就是在生成的一个新的实例的时候,完成一些初始化的工作。
Windows允许在同一时刻运行程序的几份拷贝。在概念上,应用程序的初始化可以被分为两个部分:一次性的应用程序初始化工作,这些在应用程序第一次运行时完成,以及实例的初始化工作,每次运行程序的一个拷贝时都会执行这些操作,包括第一次运行时。框架中WinMain实现调用这个函数。重载InitInstance以初始化在Windows下运行的应用程序的每个新实例。
通常,重载InitInstance以构造主窗口对象并设置CWinThread::m_pMainWnd数据成员,使其指向这个窗口。
参见:https://blog.csdn.net/beyondhaven/article/details/6018864
9.CWinAppEx类
CWinAppEx
处理应用程序状态、 将状态保存到注册表、 从注册表加载此状态,初始化应用程序管理器,并提供到同样的应用程序管理器链接。
class CWinAppEx : public CWinApp
参见:https://msdn.microsoft.com/zh-cn/library/bb983877.aspx
10.GetModuleFileName
DWORD WINAPI GetModuleFileName(
_In_opt_ HMODULE hModule,
_Out_ LPTSTR lpFilename,
_In_ DWORD nSize
);
UI:
15.AfxOleInit // 初始化 OLE 库
OLE,Object Linking and Embedding,对象连接与嵌入,简称OLE技术。OLE 不仅是桌面应用程序集成,而且还定义和实现了一种允许应用程序作为软件“对象”(数据集合和操作数据的函数)彼此进行“连接”的机制,这种连接机制和协议称为组件对象模型(COM)。
ole是对象链接嵌入技术的缩写。允许你在程序中嵌入别的程序的文档(此时你的程序成为容器),或者别的程序嵌入你的程序的文档(此时你的程序成为服务器)
你的程序完成ole的初始化,之所以有,是你创建mfc项目的时候勾选了ole的支持。
typedef struct tagINITCOMMONCONTROLSEX { DWORD dwSize; // size of this structure DWORD dwICC; // flags indicating which classes to be initialized } INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;
DWORD DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
// 将它设置为包括所有要在应用程序中使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES;
18.CWinAppEx::InitInstance(); CWinAppEx继承于WinApp,故可以使用WinApp中的函数,此函数意思为:Windows允许同一个程序的多个副本同时运行。
virtual BOOL InitInstance( );
非零,如果初始化成功;否则为0。
此条目后面可以不看
InitLibId CAtlModuleT::InitLibId 初始化包含当前模块的GUID的数据成员
LoadAppLangResourceDLL
virtual HINSTANCE LoadAppLangResourceDLL();
Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
HMODULE 是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。
HINSTANCE 在win32下与HMODULE是相同的东西,在Win32下还存在主要是因为win16
程序使用HINSTANCE来区别task。
AfxSetResourceHandle(目前程序不会调用) AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。
SupportsRestartManager 确定应用程序是否支持重新启动管理器。
返回值
TRUE 指示应用程序支持重新启动管理器; FALSE 指示应用程序不。
// Register the application with the Restart Manager, if supported. if (SupportsRestartManager()) { RegisterWithRestartManager(SupportsApplicationRecovery(), _T("")); }
RegisterWithRestartManager 注册重新启动管理器的应用程序。
virtual HRESULT RegisterWithRestartManager( BOOL bRegisterRecoveryCallback, const CString &strRestartIdentifier );
bRegisterRecoveryCallback |
TRUE 指示应用程序的此实例使用还原回调函数; FALSE 指示它不。在应用程序意外退出时,框架调用还原回调函数。有关更多信息,请参见 CWinApp::ApplicationRecoveryCallback。 |
[in] strRestartIdentifier |
标识重新启动管理器的此实例的唯一字符串。重新启动管理器标识符用于应用程序的每个实例都是唯一的。 |
参见:https://msdn.microsoft.com/zh-cn/library/dd394274.aspx
SupportsApplicationRecovery 确定重新启动管理器是恢复意外退出的应用程序。
语法 virtual BOOL SupportsApplicationRecovery() const; 返回值 TRUE 指示重新启动管理器恢复应用程序; FALSE 指示重新启动管理器不。
19.
标签:路径 tst trre 地址 htm aik details 17. 最大
原文地址:https://www.cnblogs.com/liuliwei-leo/p/9952416.html