我写了一个MFC lib其中需要一些第三方用ATL写的类,类中使用了ATL::CString
这些代码不可以修改。为了使用这些类,我做了如下处理
stdafx.h 中做了如下定义:
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将为显式的#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif
#include <afx.h>
#include <afxwin.h> // MFC 核心组件和标准组件
#include<commctrl.h>
#include <atlbase.h> #include <atlcoll.h>// CAtlMap CAtlList
#include <atlstr.h>
#include <atltypes.h>
namespace ATL
{ typedef ATL::CAtlStringW CStringW;
typedef ATL::CAtlStringA CStringA;
typedef ATL::CAtlString CString;
}
但是程序编译的时候提示我 error C2872: “CString” : 不明确的符号
也就是我工程中
CString m_str;
这种定义编译系统不知道CString 是 ATL::CString 还是MFC定义的CString .(MFC 也定义了CString)
但是MFC是在全局域中定义了CString .所以这种冲突发生的原因也就是有的头文件把ATL 这个域导入了全局域(例如通过using namespace ATL)
不知道如何处理(只在stdafx.h) 能避免这种冲突?
这些代码不可以修改。为了使用这些类,我做了如下处理
stdafx.h 中做了如下定义:
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将为显式的#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif
#include <afx.h>
#include <afxwin.h> // MFC 核心组件和标准组件
#include<commctrl.h>
#include <atlbase.h> #include <atlcoll.h>// CAtlMap CAtlList
#include <atlstr.h>
#include <atltypes.h>
namespace ATL
{ typedef ATL::CAtlStringW CStringW;
typedef ATL::CAtlStringA CStringA;
typedef ATL::CAtlString CString;
}
但是程序编译的时候提示我 error C2872: “CString” : 不明确的符号
也就是我工程中
CString m_str;
这种定义编译系统不知道CString 是 ATL::CString 还是MFC定义的CString .(MFC 也定义了CString)
但是MFC是在全局域中定义了CString .所以这种冲突发生的原因也就是有的头文件把ATL 这个域导入了全局域(例如通过using namespace ATL)
不知道如何处理(只在stdafx.h) 能避免这种冲突?
解决方案 »
- vc6.0关于消息映射函数 名字空间处理问题
- VC连接ACCESS, 插入数据时报错,帮忙看看
- 请教文件操作的问题,在线等
- 关于刷新------急!!!!!
- Vc ado访问数据库怎么实现分页 ??PutAbsolutePage 不起作用??
- 如何打印对话框?包括对话框及对话框中所有控间。马上给分!!!
- 双操作系统,98在C盘,2K在D盘,格了C盘,找不到2k了?怎么弄??
- 拜求——基于MAPX和VC在地图上划线实现运动轨迹的显示
- 如何获得一个dll的handle
- 如何获得运行中的视?(对不起我没分了,帮个忙好吗?)
- 庆祝中国孙mm/李mm夺得网球女双冠军!!! 特地问一个关于windows任务栏中图标问题.
- 一个关于dll的问题
那只有在CString全部改为ATL::CString
#undef
的预编译头指令
实施把MFC的CString给除掉
#if defined (CString)
#undef CString
#endif
好像是这么使,具体的还得问高手
namespace ATL
{ typedef ATL::CAtlStringW CStringW;
typedef ATL::CAtlStringA CStringA;
typedef ATL::CAtlString CString;
}不应该、也没必要,反而破坏了两者的兼容性 如果你是在VC6或以下的版本中使用第三方的ATL7.0的类,那就不好办了。你只好把ATL的CString 定义成其他的名字 CMyAtlString来使用,并将第三方的CString改过来
混合使用,其实现在我是在做一个大的工程,工程的主框架是MFC搭建的,但是部分界面元素是用WTL 或者.NET 写的。为了能让这三种不通的模块混合使用确实遇到了不少麻烦,不过还好都解决了、
其实MFC和WTL可以混合的,大家想想他们都是对WIN32的源代码级别上的封装,不过混合的难度就是名字空间的冲突,和部门消息处理上的差别,至于MFC中使用net的组件,如果你了解COM就可以实现了。对于一个分级的程序,我现在的设计是:
服务端(MFC+STL)来写提高运行效率 界面端使用MFC搭一个多文档的界面,部门元素用WTL 和NET来写提高开发效率,因为数据的展示和参数配置等不是很要求运行效率,这部门主要注意开发效率。 服务器端 和 界面端通过 WEB SERVICES 通讯。如果要求通讯效率的部门的WEB SERVICES 可以使用ATL webservice 来书写