VC6.0与VS2005的一些差别
分类:
一、 VC 6.0 中的 MFC ClassWizard 从 Visual Studio 2005 开始已被分拆成两个功能:1. 对控件和菜单建立事件映射的功能
菜单视图 (View)->Solution Explorer 或 Ctrl+W,S 中 Resource Files 树下,在资源视图(通过双击资源文件 *.rc 可进入该视图)选中某一个菜单或者控件,右键其中的某项,在弹出的菜单中选择“添加事件处理程序” (Add Event Handler...) ,接下来就能找到 VS 6 中类似 Message Maps 的选项;
2. 添加窗体的消息映射
菜单视图 (View)-> 类视图 (Class View) 或 Ctrl+W,C 进入类视图单击类,右键此类选中“属性” (Properties) ,进入属性界面,其上有事件 (Events) 、消息 (Messages) 、重写 (Overrides) 等。对比 VS 6 没有了 Automation( 以前称作 OLE 自动化, COM IDispatch 接口 ) 选项。
从 Visual Studio 2005 开始有了 MFC Class Wizard ,不过是在类视图中选中项目,右键 Add->Class ,选中 MFC->MFC Class ,点击 Add 后才出现的。
二、 自 Visual Studio 2005 环境起,字符串如 "Microsoft" 无法自动转换为 LPCTSTR 类型,解决方法见微软 FAQ: Cannot convert from 'const char [..]' to 'LPCTSTR' 。
三、 *View.h 消息映射中
//{
{AFX_MSG(*)...
//}}AFX_MSG
这两个 AFX_MSG 注释宏不再存在,其中 * 代表建立的项目名。
同样在 *View.cpp 消息映射中注释宏 AFX_MSG_MAP 也不再存在了。
四、 连接 *.lib 。在 VC6.0 中是在 Project->Setting 中设置,而自 Visual Studio 2005 起,菜单 Project->Properties ,设置 lib 路径(只存在 VS2005 中) :Configuration Properties->General->Addition Library Directories ,添加 lib:Configuration Properties->Linker->Input->Addition Dependences 。
五、 Visual C++ Components 目录 自 VC 7.0 就已被移除,原先在 VC++ 6.0 中的操作为:菜单 Project->Add To Project->Components and Controls->Visual C++ Components->Popup Menu 。 .Net 环境项目可以通过工具 (Tools) -> 选择工具箱项 (Choose Toolbox Items) 进行 ; MFC 中添加 Popup Menu 可以通过向 View 类中添加消息 WM_CONTEXTMENU 进行。 Splash Screen 组件也因此不存在 ,但 可以参照 Microsoft Visual Studio 9.0\Samples\1033\AllVCLanghageSamples.zip 中拷贝出 splash.cpp 和 splash.h 这两个文件 , 加入到现有项目中或者 对话框增强版 。
六、 自 Visual Studio 2003 起,控件通知消息 WM_INITDIALOG 移到了重写 (Overrides) 里面,重写里的方法 OnInitDialog() 对应 WM_INITDIALOG 消息。七、 自 VS2005 起对消息的检查更为严格, VC6 中没问题的
ON_MESSAGE(message,OnMyMessage);
返回值必须规范为 LRESULT
afx_msg LRESULT OnMyMessage(WPARAM, LPARAM) ;
返回值可以为 TRUE 或者 FALSE 。
八、 从 Components 里添加 ActiveX (基于 COM )不再可行,自 VS2005 以来中需要 Add Class->MFC Class From ActiveX Control ,点 Add ,窗口 Add Class From ActiveX Control Wizard 显现。
九、 ActiveX Control Test Container 即 tstcon32.exe ,默认保存在 %programfiles%\Microsoft Visual Studio 9.0\Common7\Tools\ 目录中,但从 VS2008 起已被移除, VS2005 是最后一个包含它的版本,如想获取它可以自行编译 TSTCON sample 或者单独获取其早期版本。
【资源】
Activex 、 OLE 、 COM 、 OCX 、 DLL 之间有什么区别?
【附录】
A : LPCTSTR
LPCTSTR = Long Pointer to a Const TCHAR STRing
LP 表示长指针,这是为了兼容 Windows 3.1 等 16 位操作系统遗留下来的,在 win32 中以及其它 32 位操作系统中, long 指针和 near 指针及 far 修饰符都是为了兼容的作用,没有实际意义。
P 表示是指针。
C 表示是常量即 const 。
T 在 Win32 环境中是一个 _T 宏,这个宏用来表示你的字符是否使用 UNICODE 。如果你的程序定义了 UNICODE 或者其它相关的宏,那么这个字符或者字符串将被作为 UNICODE 字符串, 否则就是标准的 ANSI 字符串。
STR 表示这个变量是字符串。
所以 LPCTSTR 就表示一个指向长地址的可以根据一些宏定义改变语义的固定字符串。
完整定义见 WinNT.h :
FAQ: Cannot convert from 'const char [..]' to 'LPCTSTR'
Question
I'm trying to compile a piece of code such as: //我试着编译这个代码片段:
MessageBox("Hello world!");
... when I compile the project, the compiler yields: //当我编译这个项目的时候,编译结果:
error C2664: 'CWnd::MessageBoxW' : cannot convert parameter 1 from 'const char [12]' to 'LPCTSTR'
What am I doing wrong? //我做错了什么呢?
Problem (问题)
This error message means that you are trying to pass a multi-byte string (const char [12]) to a function which expects a unicode string (LPCTSTR). The LPCTSTR type extends to const TCHAR*, where TCHAR is char when you compile for multi-byte and wchar_t for unicode. Since the compiler doesn't accept the char array, we can safely assume that the actual type of TCHAR, in this compilation, is wchar_t.
Resolution (解决)
You will have to do one of two things: //你得做两件事中的任何一件
1、Change your project configuration to use multibyte strings. Press ALT+F7 to open the properties, and navigate to Configuration Properties > General. Switch Character Set to "Use Multi-Byte Character Set".
2、Indicate that the string literal, in this case "Hello world!" is of a specific encoding. This can be done through either prefixing it with L, such as L"Hello world!", or surrounding it with the generic _T("Hello world!") macro. The latter will expand to the L prefix if you are compiling for unicode (see #1), and nothing (indicating multi-byte) otherwise.
(译)
1、改变你的项目配置为使用多字节字符串。按Alt + F7打开的属性,并导航到配置属性>“常规。切换字符集“使用多字节字符集”。
2、表明字符串在此情况下,"Hello world!" 是一个特定的编码。这也可以通过在字符串前面加上前缀L,如: L"Hello world!", ,或通用宏_T来这样使用,如: _T("Hello world!")。后者将扩大到L前缀如果您对Unicode编译(见#1),除了将它转多字节格式,其它没有什么。
例如: MessageBoxW(L"出错啦!"); 或者 MessageBoxW(_T("出错啦!"));
第一种方法:
按下Alt+F7或右键项目->单击“属性”->配置属性->项目默认值->字符集
然后,将“使用Unicode字符集”改为“使用多字节字符集”
见图:
Variations
Another error message, indicating the same problem, would be:
cannot convert parameter 1 from 'const char [12]' to 'LPCWSTR'
'LPCWSTR'
Where LPCWSTR maps to a wchar_t pointer, regardless of your build configuration. This problem can be resolved primarily by using solution #2, but in some cases also #1. A lot of the Microsoft provided libraries, such as the Platform SDK, have got two variations of each function which takes strings as parameters. In case of a unicode build, the actual functions are postfixed W, such as the MessageBoxW seen above. In case of multi-byte, the function would be MessageBoxA (ASCII). Which of these functions is actually used when you compile your application, depends on the setting described in resolution #1 above.
(译)凡LPCWSTR映射到一个wchar_t指针,不管你的构建配置。这个问题可以解决,主要通过使用解决方案#2,但在某些情况下也#1。是微软提供了很多这样的SDK库为平台,有两只每个函数,它接受字符串作为参数的变化。在建立一个Unicode案件,实际功能是后缀瓦,如MessageBoxW上面看到的。在多字节的情况下,函数将MessageBoxA(ASCII码)。实际使用的是当你编译你的应用这些功能其中,取决于在1号决议所述的设置。
熟悉面向对象编程和网络编程的人一定对ActiveX、OLE和COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多们还是 比较模糊的。在具体介绍它们的关系之间,我们还是先明确组件(Component)和对象(Object)之间的区别。组件是一个可重用的模块,它是由一 组处理过程、数据封装和用户接口组成的业务对象(Rules Object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是: 1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用; 2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序; 3)组件为模块重用,而对象为代码重用。现在,比较流行的组件模型有COM(Component Objiect Module,对象组件模型)/DCOM( Distributed COM,分布式对象组件模型)和CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)。到这里,已经出现了与本文相关的主题COM,而CORBA与本文无关,就不作介绍。之所以从组件 与对象的区别说起,是想让大家明确COM和 CORBA是处在整个体系结构的最底层,如果暂时对此还不能理解,不妨继续往下看,最后在回过头看一看就自然明白了。现在开始阐述ActiveX、OLE 和COM的关系。首先,让大家有一个总体的概念,从时间的角度讲,OLE是最早出现的,然后是COM和ActiveX;从体系结构角度讲,OLE和 ActiveX是建立在 COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是大家更多的听说 ActiveX和OLE的原因。既然OLE是最早出现的,那么就从OLE说起,自从Windows操作系统流行以来,“剪贴板”( Clipboard)首先解决了不同程序间的通信问题(由剪贴板作为数据交换中心,进行复制、粘贴的操作),但是剪贴板传递的都是“死”数据,应用程序开 发者得自行编写、解析数据格式的代码,于是动态数据交换(Dynamic Data Exchange,DDE)的通信协定应运而生,它可以让应用程序之间自动获取彼此的最新数据,但是,解决彼此之间的“数据格式”转换仍然是程序员沉重的 负担。对象的链接与嵌入(Object Linking and Embedded,OLE)的诞生把原来应用程序的数据交换提高到“对象交换”,这样程序间不但获得数据也同样获得彼此的应用程序对象,并且可以直接使用 彼此的数据内容,其实OLE是Microsoft的复合文档技术,它的最初版本只是瞄准复合文档,但在后续版本OLE2中,导入了COM。由此可 见,COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。 COM的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。COM是应OLE 的需求而诞生,但它的第一个使用者却是OLE2,所以COM与复合文档间并没有多大的关系,实际上,后来COM就作为与复合文档完全无关的技术,开始被广 泛应用。这样一来, Microsoft就开始“染指”通用平台技术。但是COM并不是产品,它需要一个商标名称。而那时Microsoft的市场专家们已经选用了OLE作为 商标名称,所以使用COM技术的都开始贴上了 OLE的标签。虽然这些技术中的绝大多数与复合文档没有关系。Microsoft的这一做法让人产生这样一个误解OLE是仅指复合文档呢?还是不单单指复 合文档?其实OLE是COM的商标名称,自然不仅仅指复合文档。但Microsoft自己恐怕无法解释清楚,这要花费相当的精力和时间。 于是,随着Internet的发展,在1996年春,Microsoft改变了主意,选择ActiveX作为新的商标名称。ActiveX是指宽松定义 的、基于COM的技术集合,而OLE仍然仅指复合文档。当然, ActiveX最核心的技术还是COM。ActiveX和OLE的最大不同在于,OLE针对的是桌面上应用软件和文件之间的集成,而ActiveX则以提 供进一步的网络应用与用户交互为主。到这里,大家应该对ActiveX、OLE和COM三者的关系有了一个比较明确的认识,COM才是最根本的核心技术, 所以下面的重点COM。让对象模型完全独立于编程语言,这是一个非常新奇的思想。这一点从C++和Java的对象概念上,我们就能有所了解。但所谓COM 对象究竟是什么呢?为了便于理解,可以把COM看作是某种(软件)打包技术,即把它看作是软件的不同部分,按照一定的面向对象的形式,组合成可以交互的过 程和以组支持库。COM对象可以用C++、Java和VB等任意一种语言编写,并可以用DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象 的浏览器,无需关心对象是用什么语言写的,也无须关心它是以DLL还是以另外的过程来执行的。从浏览器端看,无任何区别。这样一个通用的处理技巧非常有 用。例如,由用户协调运行的两个应用,可以将它们的共同作业部分作为COM对象间的交互来实现(当然,现在的OLE复合文档也能做到)。为在浏览器中执行 从Web服务器下载的代码,浏览器可把它看作是COM对象,也就是说,COM技术也是一种打包可下载代码的标准方法(ActiveX控件就是执行这种功能 的)。甚至连应用与本机OS进行交互的方法也可以用COM来指定,例如在Windows和Windows NT中用的是新API,多数是作为COM对象来定义的。可见,COM虽然起源于复合文档,但却可有效地适用于许多软件问题,它毕竟是处在底层的基础技术。 用一句话来说,COM是独立于语言的组件体系结构,可以让组件间相互通信。随着计算机网络的发展,COM进一步发展为分布式组件对象模型,这就是 DCOM,它类似于CORBA的ORB,本文对此将不再做进一步的阐述。通过上面的讲述相信大家一定对ActiveX、OLE和COM/DCOM的关系有 了一个清楚的了解。
使用Windows的人对于ActiveX控制一定不会陌生,它提供了一种类似于DLL动态链接库的调用,不过它与DLL的唯一区别就是ActiveX不 注册不能被系统识别并使用。那么,当我们得到一个ActiveX没有被正确安装且不能使用的消息后,又要安装ActiveX怎么办 呢?1.Regsvr32程序法在Windows的System文件夹下有一个regsvr32.exe的程序,它就是Windows自己带的 ActiveX注册和反注册工具。利用它也能够非常方便地注册AcitveX控件,它的用法为:regsvr32/u/s/n/i dllname, dllname其中dllname为ActiveX控件文件名,建议在安装前拷贝到System文件夹下参数有如下意义:/u - 反注册控件/s - 不管注册成功与否,均不显示提示框/c - 控制台输出/i - 跳过控件的选项进行安装 (与注册不同)/n - 不注册控件,此选项必须与/i 选项一起使用例如笔者要注册一amovie.ocx控件,则打入 regsvr32 amovie.ocx即可,要反注册它时只需使用 regsvr32 /u amovie.ocx就行了。2.注册表法所谓注册AcitveX,无非是将一些信息记录在Windows的注册表中,如Shockwave Flash Object控件,我们可以运行Regedit.exe注册表编辑程序,利用关键字进行搜索,然后把搜索得到后的注册表导出为一REG注册表文件,再将其 相应的ActiveX文件拷贝到Windows的System文件夹(一般ActiveX的文件名为OCX,安装在Windows的System文件夹 内)下,最后在要安装ActiveX的机器上双击导入刚才导出的注册表文件即可完成安装。