HOWTO: 给 ATL 项目添加 MFC 支持

原创 2007年09月15日 17:14:00

http://support.microsoft.com/kb/q173974/
===========================

HOWTO: 给 ATL 项目添加 MFC 支持

文章编号 : 173974
最后修改 : 2004年1月21日
修订 : 2.0
本文的发布号曾为 CHS173974

概要

当使用 AppWizard 创建 ATL EXE 项目时,MFC 支持复选框未被选中。 本文讲述如何将 MFC 支持添加到 ATL EXE 项目中。 本文还解释了如果在 AppWizard 中最初不能选中“Support MFC”复选框,如何给 ATL DLL 项目添加 MFC 支持。

回到顶端

更多信息

给 ATL EXE 项目添加 MFC 支持



1. 在包括 Atlbase.h 之前,将以下 #include 指令添加到 StdAfx.h:
      #include <afxwin.h>   // MFC core and standard components
      #include <afxext.h>   // MFC extensions
      #include <afxdisp.h>  // MFC Automation extensions
2. 更改项目设置以使用 MFC。 在 Project Settings 对话框中,单击 General 选项卡,然后将 Microsoft Foundation Classes 列表框中的设置更改为 MFC。
3. 添加 CWinApp 衍生类,并声明一个该类型的全局变量,如下所示:
class CMyApp : public CWinApp
      {
      public:
         virtual BOOL InitInstance();
         virtual int ExitInstance();
      protected:
      BOOL m_bRun;
};
4. 用以下 InitInstance 和 ExitInstance 代码替换 _tWinMain 函数:
BOOL CMyApp::InitInstance()
{
	// Initialize OLE libraries.
	if (!AfxOleInit())
	{
		AfxMessageBox(_T("OLE Initialization Failed!"));
		return FALSE;
	}

	// Initialize CcomModule.
	_Module.Init(ObjectMap, m_hInstance);
	_Module.dwThreadID = GetCurrentThreadId();

	// Check command line arguments.
	TCHAR szTokens[] = _T("-/");
	m_bRun = TRUE;
	LPCTSTR lpszToken = FindOneOf(m_lpCmdLine, szTokens);
	while (lpszToken != NULL)
	{
		// Register ATL and MFC class factories.
		if (lstrcmpi(lpszToken, _T("Embedding"))==0 ||
		lstrcmpi(lpszToken, _T("Automation"))==0)
		{
			AfxOleSetUserCtrl(FALSE);
			break;
		}
	// Unregister servers.
	// There is no unregistration code for MFC
	// servers. Refer to <LINK TYPE="ARTICLE" VALUE="Q186212">Q186212</LINK> "HOWTO: Unregister MFC
	// Automation Servers" for adding unregistration
	// code.
		else if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
		{
			VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, FALSE)));
			VERIFY(SUCCEEDED(_Module.UnregisterServer(TRUE)));
			m_bRun = FALSE;
			break;
		}
	// Register ATL and MFC objects in the registry.
		else if (lstrcmpi(lpszToken, _T("RegServer"))==0)
		{
			VERIFY(SUCCEEDED(_Module.UpdateRegistryFromResource(IDR_ServerS2B, TRUE)));
			VERIFY(SUCCEEDED(_Module.RegisterServer(TRUE)));
			COleObjectFactory::UpdateRegistryAll();
			m_bRun = FALSE;
			break;
		}
		lpszToken = FindOneOf(lpszToken, szTokens);
	}
	if (m_bRun)
	{
		// Comment out the next line if not using VC 6-generated
		// code.
		_Module.StartMonitor();

		VERIFY(SUCCEEDED(_Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE)));
		VERIFY(COleObjectFactory::RegisterAll());
		// To run the EXE standalone, you need to create a window
		// and assign the CWnd* to m_pMainWnd.
		LPCTSTR szClass = AfxRegisterWndClass(NULL);
		m_pMainWnd = new CWnd;
		m_pMainWnd->CreateEx(0, szClass, _T("SomeName"), 0, CRect(0, 0, 0, 0), NULL, 1234);
	}
	return TRUE;
}

int CMyApp::ExitInstance()
{
	// MFC's class factories registration is
	// automatically revoked by MFC itself.
	if (m_bRun)
	{
		_Module.RevokeClassObjects();
        Sleep(dwPause); //wait for any threads to finish
    }

    _Module.Term();
	return 0;
}
5. 对于 Unicode 版本,请确保进入点被设置为 wWinMainCRTStartup,该设置在 Project Settings 对话框中 Link 字段的 Output 类别中。 有关其它信息,请参见 Microsoft Knowledge Base 中的下列文章:
125750 (http://support.microsoft.com/kb/125750/EN-US/) PRB: 错误 LNK2001: “_WinMain@16”: 不能解析的外部符号
6. 将以下代码行添加到 COM 接口、窗口过程和导出函数的每个成员函数的开头:
AFX_MANAGE_STATE(AfxGetAppModuleState());
有关 AFX_MANAGE_STATE 的详细信息,请查询 VC++ 联机文档。
有关将 MFC 支持添加到 ATL COM AppWizard 项目的详细信息,请参见下面的 Microsoft Knowledge Base 文章:
181505 (http://support.microsoft.com/kb/181505/EN-US/) PRB: ATL COM AppWizard 不提供对 .EXE 的 MFC 支持

回到顶端

将 MFC 支持添加到 ATL DLL 项目



执行上面的步骤 1 到步骤 3。

1. 将 AppWizard 生成的 DllMain 的 DLL_PROCESS_ATTACH 和 DLL_PROCESS_DETACH 中的代码移到 CMyApp 的 InitInstance 和 ExitInstance,并删除 DllMain,如下所示:
      BOOL CMyApp::InitInstance()
      {
         _Module.Init(ObjectMap, m_hInstance);
         return CWinApp::InitInstance();
      }

 int CMyApp::ExitInstance()
{
    // MFC's class factories registration is
    // automatically revoked by MFC itself.
    if (m_bRun)
        _Module.RevokeClassObjects();

2. 将以下代码行添加到 COM 接口、窗口过程和导出函数的每个成员函数的开头:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
有关其它信息,请参见 Microsoft Knowledge Base 中的下列文章:
140850 (http://support.microsoft.com/kb/140850/EN-US/) HOWTO: 转换 DLLTRACE 以使用共享库中的 MFC
备注:对于所有的发行版本,请确保 _ATL_MIN_CRT 预处理器定义已经被删除。 您可以在 Project Settings 对话框中 C/C++ 选项卡的 Preprocessor 类别中找到这些定义。

当使用 ClassWizard 将一个从 MFC 类衍生的类添加到 ATL EXE 项目或 ATL DLL 项目时,如果没有“MFC 支持”,编译器将发出 C2504 错误消息。

回到顶端

参考

MFCATL 示例附带在 Visual C++ 5.0 中。 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

MFC ATL和OCX控件在静态页面可以调用方法,在apache项目中无法调用或报错“对象不支持属性或方法”

我是个新手,对MFC的认识并不深,更不用说这些单独的控件开发了,前段时间,应客户需求,弄了个OCX控件,注册在本地系统中,在本地静态html中可以正确的执行,当放到apache项目中测试的时候,却无法...

CPictureEx和CPictureExWnd类,将GIF动画添加到MFC和ATL项目中

翻译来源: https://www.codeproject.com/Articles/1427/Add-GIF-animation-to-your-MFC-and-ATL-projects-wit 这...

Visual Studio 9.0(2008) Mini版的整理。 (支持WTL/ATL/MFC/Win32)

软件名称:Visual Studio 9.0(2008) Mini版 功能:可以脱离 VS2008来编译 WTL/ATL/MFC/Win32 工程 PS:不支持 C#、VB以及其它语言的编译。 ...

duilibTreeView ATL WTL MFC 支持

  • 2011-07-02 17:00
  • 3.91MB
  • 下载

在ATL项目中添加WTL界面

之前在Atl项目中添加过mfc的dialog对话框,只要在建立atl项目时勾选mfc支持就可以。 现在想在AtL的动态链接库中调用Wtl框架,拿到之后,就犯迷糊了。网上查了一些资料,参考了:http...

向VS2015添加WTL项目向导(ATL/WTL Application Wizard)

刚装了个VS2015社区版,微软地球良心企业啊~~Embarcader能学点不? VS装得再高端我也只会用个WTL,到目前为止(2015/08/09)WTL官网上还是只有WTL9.0版,最高支持到V...

如何添加对 ATL 的应用程序承载 VBScript 的支持

您可以添加类似于 VBA 的脚本编写功能到 ATL 应用程序开销很小使用 Microsoft ActiveX 脚本技术。本文演示了如何创建一个新的 ATL 应用程序或合并 VBScript 支持的一个...

HOWTO: How to Provide Your Own DllMain in an MFC Regular DLL

http://support.microsoft.com/kb/148791/en-us Additional care must be taken when relying on DllMai...

ATL--创建简单的ATL之dll工程,添加类和类的接口并在MFC中调用

开发环境 Windows Server 2012  VS2010 Sp1 番茄助手 创建ATL简单dll工程 1、打开VS2010,新建ATL COM 项目,步骤:“文件” “新建” “项目”,选择“...

C Runtime Library来历, API, MFC, ATL关系

首先说明,我google了半天,想找到英文的关于这个资料,但是实在找不到,只好转载国人的讨论。   CRT原先是指Microsoft开发的C Runtime Library,用于操作系统的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)