VC++程序由Visual Studio 2003升级到Visual Studio 2005手记

我们新版的应用程序,是一个通用的数据库管理程序,到目前为止所有的代码都是通过VC编写,核心部分的设计基本完成,希望可以通过.NET开发一些小的模块,VC8.0(Visual C++2005),以提高开发效率,另外,VC的程序员实在难找啊。因此我们需要将VS2003下的C++代码升级到VS2005下,从而可以充分利用.NET与C++混合编程。

升级的基本过程如下:

1、首先备份现有的VC程序,备份之后启动VS2005。

2、通过VS2005打开要升级的解决方案,系统提示自动转换,如果VC程序已经被嵌入到VSS中,则系统将提示登录VSS,并且自动将解决方案文件和项目文件签出。(注意选择备份原来版本 的解决方案的选项。)

3、一般情况下系统提示成功,可能会有两个警告,可以不予理会。因为升级过程中仅仅修改了解决方案文件和工程项目文件,所以速度会很快,C++头文件和CPP文件都不作任何修改(这和VB6到VB2005的升级不同),因此速度很快。

4、在VS2005中重新编译升级后的程序,很可能出现很多警告和错误提示,警告可以不予理会,错误提示必须修改。我所遇到的错误提示主要有两种:一种提示是“某个变量没有定义”,另外一种是模板类的消息映射的错误提示。

先说第一种错误提示,例如如下的两个for循环语句

for(int i=0;i<10;i++)

{

}

for(i=0;i<100;i++)//此处将提示i没有定义

上面的语句在VS2003中没有问题,在2005中则是错误的,2005将i作为第一个for循环中的局部变量处理,因此编译器认为第二个for循环中的i没有定义。这类错误可能有很多,但是修改起来比较容易。

第二种错误是模板类的消息映射宏错误。我在程序中设计了一个控件模板:

template <class B,class P>class CUniDataCtrl : public B,public CUniDataBaseCtrl
{

并通过typedef定义了很多类型(20多个)

#define UNI_FORMVIEW_CONTROLS(P) /
typedef CUniDataCtrl<CEdit,P> MEDICONEXPORT CUniEdit; /
typedef CUniDataCtrl<CEditAddress,P> MEDICONEXPORT CUniAddress; /
typedef CUniDataCtrl<CComboBoxData,P> MEDICONEXPORT  CUniComboBox; /

。。。。

UNI_FORMVIEW_CONTROLS(CMdcLayerPanel)

必须为每个类型的控件定义一个消息映射宏,所以我定义了一系列的宏:

#define Map(T,B) /
BEGIN_MESSAGE_MAP(T, B)/
 ON_WM_LBUTTONDOWN()/
 ON_WM_RBUTTONDOWN()/
 ON_WM_MOUSEMOVE()/
 ON_WM_SETCURSOR()/
 ON_WM_SETFOCUS()/
 ON_WM_KILLFOCUS()/
 ON_REGISTERED_MESSAGE(BCGM_PROPERTY_CHANGED,OnPropertyChange)/
END_MESSAGE_MAP()

#define MSG_MAP_UNI_EDIT Map(CUniEdit,CEdit)
#define MSG_MAP_UNI_ADDRESS Map(CUniAddress,CEditAddress)
#define MSG_MAP_UNI_COMBOBOX Map(CUniComboBox,CComboBoxData)
#define MSG_MAP_UNI_DATETIMECTRL Map(CUniDateTimeCtrl,CMyDateTimeCtrl)
#define MSG_MAP_UNI_CHECKCOMBOBOX Map(CUniCheckComboBox,CCheckComboBox)

#define MSG_MAP_UNI_ALL /
MSG_MAP_UNI_EDIT /
MSG_MAP_UNI_ADDRESS /
MSG_MAP_UNI_COMBOBOX /
MSG_MAP_UNI_DATETIMECTRL /
MSG_MAP_UNI_CHECKCOMBOBOX /

最后,我在一个CPP文件中直接调用 MSG_MAP_UNI_ALL 既完成了宏的消息映射的定义。

但是这种方式在VS2005中无法编译通过,最后我不得不在模板类的头文件中增加了如下的一个消息映射宏

#define BEGIN_TEMPLATE_MESSAGE_MAP_EX(theClass, type_name1,type_name2,  baseClass)   /
 PTM_WARNING_DISABLE              /
 template < typename type_name1,typename type_name2 >           /
 const AFX_MSGMAP* theClass< type_name1 ,type_name2 >::GetMessageMap() const   /
  { return GetThisMessageMap(); }          /
 template < typename type_name1 ,typename type_name2>           /
 const AFX_MSGMAP* PASCAL theClass< type_name1 ,type_name2  >::GetThisMessageMap()  /
 {                  /
  typedef theClass< type_name1 ,type_name2  > ThisClass;       /
  typedef baseClass TheBaseClass;          /
  static const AFX_MSGMAP_ENTRY _messageEntries[] =     /
  {

然后在CPP文件中使用这个宏

BEGIN_TEMPLATE_MESSAGE_MAP_EX(CUniDataCtrl,B,P ,B)
 ON_WM_LBUTTONDOWN()
 ON_WM_RBUTTONDOWN()
 ON_WM_MOUSEMOVE()
 ON_WM_SETCURSOR()
 ON_WM_SETFOCUS()
 ON_WM_KILLFOCUS()
 ON_REGISTERED_MESSAGE(BCGM_PROPERTY_CHANGED,OnPropertyChange)
END_MESSAGE_MAP()

则直接实现了原来几十行代码实现的功能。

上述的模板类消息映射宏我是参考BEGIN_TEMPLATE_MESSAGE_MAP(theClass, type_name, baseClass)编写的,该宏只支持一个模板参数,而我定义的模板中需要两个模板参数,因此,我自己扩充了一下。关于BEGIN_TEMPLATE_MESSAGE_MAP的帮助在MSDN中好像没有,在afxwin.h中定义了:

#define DECLARE_MESSAGE_MAP() /
protected: /
 static const AFX_MSGMAP* PASCAL GetThisMessageMap(); /
 virtual const AFX_MSGMAP* GetMessageMap() const; /

#define BEGIN_TEMPLATE_MESSAGE_MAP(theClass, type_name, baseClass)   /
 PTM_WARNING_DISABLE              /
 template < typename type_name >           /
 const AFX_MSGMAP* theClass< type_name >::GetMessageMap() const   /
  { return GetThisMessageMap(); }          /
 template < typename type_name >           /
 const AFX_MSGMAP* PASCAL theClass< type_name >::GetThisMessageMap()  /
 {                  /
  typedef theClass< type_name > ThisClass;       /
  typedef baseClass TheBaseClass;          /
  static const AFX_MSGMAP_ENTRY _messageEntries[] =     /
  {

#define BEGIN_MESSAGE_MAP(theClass, baseClass) /
 PTM_WARNING_DISABLE /
 const AFX_MSGMAP* theClass::GetMessageMap() const /
  { return GetThisMessageMap(); } /
 const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() /
 { /
  typedef theClass ThisClass;         /
  typedef baseClass TheBaseClass;        /
  static const AFX_MSGMAP_ENTRY _messageEntries[] =  /
  {

#define END_MESSAGE_MAP() /
  {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } /
 }; /
  static const AFX_MSGMAP messageMap = /
  { &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; /
  return &messageMap; /
 }          /
 PTM_WARNING_RESTORE

不知道2003中是否有关于模板类消息映射宏的解决方案。不过,这已经不重要了,我已经决定卸载VS 2003 .NET了。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值