VC6.0代码向VS2005迁移遇到的问题与解决

本文介绍了将VC6.0项目迁移到VS2005时遇到的MFC接口变化、库依赖、项目框架差异及COM支持问题,并提供了解决方案,包括使用_MSC_VER宏、重编译库、重构COM组件和利用_CAtlModule全局指针适应新的DLL模块结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

VC2005VC6的编译环境,库的支持有诸多的不同,所以直接迁移有很多无法预料的风险。目前遇到的主要问题如下:

1. MFC类库有些类的接口定义已发生改变,如CRichEditCtrl::CreateEx函数CWnd:: OnActivateApp消息相应函数。

2. 库支持方面的更改,目前ToolsSDK库是VC6环境下编译的,其中有些函数依赖于VC6下的一些特定库,直接把VC6下的库拷贝过来可能会有无法预测的风险。

3. VC2005VC6的项目生成向导生成的代码框架差别比较大,这其中可能一有些类引用依赖的宏发生改变。

4. COM的支持变动较大。

鉴于上面的原因和一些目前尚不明了的隐患,建议先用VC2005向导建立项目框架,然后在逐步加入现有的代码文件,这样编译环境相对干净,排查问题也少走弯路。

解决方案:

对于第一点,可以使用_MSC_VER宏来控制,1400VC2005编译器版本号。可用如下代码对变动的函数接口加以控制:

#if _MSC_VER == 1400 // VC 2005

afx_msg void OnActivateApp(BOOL bActiveDWORD hTask);

#else

afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);

#endif

    第二个问题,有些lib库,在VC6下编译生成,依赖于MFC42.lib这个VC6提供的库,VC2005链接是会提示找不到MFC42.lib这个库。所以,直接把VC6编译的的源代码加入到VS2005项目中,然后编译可以通过,经验证,运行也没有问题。

第三个问题,受影响较大的是COM项目,COM采用重建的方法(有点土:p)

最后一个问题主要是VC6中的一些COM的全局变量,主要是CComModule _Module这个对象。在VC2005中,ATL7.0CComModule已经舍弃了,取而代之的是CAtlDllModuleT模板类,向导会在DLL导出函数实现(DllMain所在的.cpp文件)中自动生成一个继承自CAtlDllModuleT的类,如:

class CXXXModule : public CAtlDllModuleTCXXXModule >

{

public :

DECLARE_LIBID(LIBID_XXXLib)

DECLARE_REGISTRY_APPID_RESOURCEID(IDR_XXX"{16E6FC24-0E4F-4669-B114-09A16D9068E8}")

};

CXXXModule _AtlModule;

可以看出_AtlModule取代了VC6中的CComModule实例,其类型CQDSkinModule是继承自CAtlDllModuleT模板类,它代表这个DLL模块。

由于CXXXModule是定义在.cpp文件中,有时候我们难免需要用到_AtlModule这个实例,怎么办?查看atlbase.h文件,template<T> CAtlDllModuleT是继承自模板CAtlModuleT<T>这个模板类的,而CAtlModule<T>又是继承自CAtlModule,类层次图如下:

并且在atlbase.h头文件中,定义了一个CAtlModule_pAtlModule指针,在CAtlModule的默认构造函数中,会对_pAtlModule做如下初始化

_pAtlModule = this;

所以,我们只要包含atlbase.h这个头文件,就可以通过_pAtlModule应用到CQDSkinModule _AtlModule这个对象了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值