为什么有的mfc项目中的InitInstance不用到这段代码① pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS (CTestDoc), RUNTIME_CLASS(CMainFrame), //主SDI框架窗口 RUNTIME_CLASS(CTestView)); if(!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate);
时间: 2024-04-01 16:31:19 浏览: 109
这段代码是用来初始化 MFC 应用程序的单文档模板(Single Document Template,SDT),即指定了应用程序的主框架窗口、文档类和视图类。如果应用程序只有一个文档视图,那么需要使用这段代码来初始化 SDT。但如果应用程序不需要文档视图,或者有多个文档视图,则可以不需要这段代码。
请注意,这段代码不是必需的,因为在 MFC 应用程序的 InitInstance 函数中,还可以使用其他方式来初始化文档视图,比如使用 CWinAppEx::InitInstance 函数中的 AddDocTemplate 函数。所以在某些情况下,可能会选择不使用这段代码。
相关问题
BOOL CDemoApp::InitInstance() { // 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. m_pszProfileName = strdup("PCTLDEMO.INI"); m_pszHelpFilePath = strdup("..\\docs\\vcet.hlp"); SetDialogBkColor(); // set dialog background color to gray LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. AddDocTemplate(new CMultiDocTemplate(IDR_DEMOTYPE, RUNTIME_CLASS(CDemoDoc), RUNTIME_CLASS(CMyMDIChildWnd), // standard MDI child frame RUNTIME_CLASS(CDemoView))); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; // Initialise the controls PAN_LoadControls(NULL, NULL); pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); m_pMainWnd = pMainFrame; // create a new (empty) document OnFileNew(); // instanciate notification procedure *((FARPROC * ) &lpfnNotifyProc) = MakeProcInstance((FARPROC) NotifyWndProc, AfxGetInstanceHandle()); if (lpfnNotifyProc == NULL) { ::MessageBox((HWND) 0, "Cannot make procedure instance!", "INFO", MB_ICONINFORMATION); return FALSE; } if (m_lpCmdLine[0] != '\0') { // TODO: add command line processing here } return TRUE; }
这段代码是一个 MFC 应用程序的初始化函数 `BOOL CDemoApp::InitInstance()`,它包含了一些标准的初始化步骤和自定义的初始化操作。让我逐一解释一下:
1. `m_pszProfileName` 和 `m_pszHelpFilePath` 的赋值:
- `m_pszProfileName` 是应用程序的配置文件名,这里将其设置为 "PCTLDEMO.INI"。
- `m_pszHelpFilePath` 是应用程序的帮助文件路径,这里将其设置为 "..\\docs\\vcet.hlp"。
2. `SetDialogBkColor()`:设置对话框的背景颜色为灰色。
3. `LoadStdProfileSettings()`:加载标准的 INI 文件选项,包括最近使用的文件列表(MRU)等。
4. 注册应用程序的文档模板:
- `IDR_DEMOTYPE` 是资源 ID,表示该文档模板对应的资源。
- `CDemoDoc` 是文档类。
- `CMyMDIChildWnd` 是标准的 MDI 子窗口类。
- `CDemoView` 是视图类。
5. 创建主 MDI 框架窗口 `CMainFrame`,并加载框架窗口的资源。如果加载失败,则返回 FALSE。
6. `PAN_LoadControls(NULL, NULL)`:初始化控件。
7. 显示和更新主框架窗口。
8. `m_pMainWnd` 指向主框架窗口。
9. `OnFileNew()`:创建一个新的空文档。
10. `MakeProcInstance((FARPROC) NotifyWndProc, AfxGetInstanceHandle())`:创建一个用于处理通知的过程实例。
11. 检查 `lpfnNotifyProc` 是否为空,如果为空,则显示一个消息框,并返回 FALSE。
12. 如果命令行参数 `m_lpCmdLine` 不为空,则可以在这里添加命令行处理的代码。
最后,函数返回 TRUE,表示初始化成功。
为什么有的mfc项目的initinstance函数中不初始化ole库
在 MFC 应用程序中,如果您的应用程序不需要使用 OLE 技术,那么您可以选择不在 InitInstance 函数中初始化 OLE 库。这样可以减少应用程序的内存占用和启动时间,并且避免不必要的初始化开销,提高应用程序的性能。
如果您的应用程序需要使用 OLE 技术,那么您需要在 InitInstance 函数中调用 AfxOleInit() 函数来初始化 OLE 库。这将会为您的应用程序提供许多 OLE 功能,例如在应用程序中嵌入和链接对象、使用 COM 组件等。
需要注意的是,如果您的应用程序不使用 OLE 技术,那么您在 InitInstance 函数中调用 AfxOleInit() 函数可能会导致一些不必要的问题,例如内存泄漏、初始化失败等。因此,如果您的应用程序不需要使用 OLE 技术,建议不要在 InitInstance 函数中初始化 OLE 库。
总之,是否需要在 InitInstance 函数中初始化 OLE 库取决于您的应用程序的具体需求。如果您的应用程序需要使用 OLE 技术,那么您需要调用 AfxOleInit() 函数来初始化 OLE 库;如果您的应用程序不需要使用 OLE 技术,那么您可以选择不在 InitInstance 函数中初始化 OLE 库。
阅读全文