COM编程常见问题:VC和VS中的不同

来源:互联网 发布:大数据泄露 编辑:程序博客网 时间:2024/06/03 20:52

TSTCON32.exe消失于Visulal studio

我们在编写ActiveX控件的时候,一般都会用Active X control test container来进行简单的测试,这在VisualStudio 6里面是很方便查找的,工具菜单下面就有。但是在VisualStudio 2008里面TSTCON32.exe这个文件却消失了,在VisualStudio 2008的安装目录下也找不到这个文件。经过在网上搜索,原来微软把它放在了例子程序里面,需要自己编译。详细目录:比如我装在C盘里面,VC的例子在 “C:\Program Files\Microsoft Visual Studio 9.0\Samples\2052\AllVCLanguageSamples.zip”,吧这个文件解压缩以后,在下面的目录可以找到TSTCON32.exe的源代码:“C++\MFC\ole\TstCon”,自己编译就可以了。

在2010中,需要搜索目录C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033,解压VC2010Samples.zip,查找D:\Program Files\Microsoft Visual Studio 10.0\Samples\1033\VC2010Samples\C++\MFC\ole\TstCon,编译即可。

如果编译时出错如:

Unable to start program 'E:\wgf\My Documents\Visual Studio 2008\Projects\Lesson\TstCon\Debug\TstCon32.exe'.
This application has failed to start because the application configuration is incorrect. Review the manifest file for possible errors. Reinstalling the application may fix this problem. For more details, please see the application event log

解决方法:
编译命令行设置/MANIFESTUAC:NO(User Account Control为NO),或者Project -> Properties -> Linker -> Manifest File -> Enable User Account Control(UAC) = False  

TstCon解决方案里面的两个项目属性都设置一下,就行了

另附VS和vc常见区别

一、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' 。 

http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/c1b08c0a-a803-41c3-ac8c-84eba3be1ddb/

三、*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(即VS2005) 就已被移除,原先在 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 或者单独获取其早期版本。


再讲下vs添加事件和添加属性,控件关联的方法,不同于vc6.0那样,在vs中是分开来的,这点显得非常不智能。

添加属性方法如下:

vc中直接Ctrl+w弹出Class Wizard中在Automation中选择即可:



vs中的

Class Wizard中没有该选项,添加方法

的:



在lib下有两个:一个是Test,一个是TestEvent,都有该选项,不要选下面的右键,这是添加外部事件的类。

对于属性的关联,如将一个editText控件中的数值关联到属性interval(自定义属性),在vc中直接右键控件选择CW直接关联即可

,因为有此选项:

而vs中木得,它只可以关联变量:



所以解决的方法是只能手动添加一行代码:

 

void CMyOCXTestPropPage::DoDataExchange(CDataExchange* pDX)

{

 

DDP_Text(pDX, IDC_EDIT_Interval, m_updateInterval,_T("Interval"));//关联属性,需要手动添加此行_T("Interval"为要关联的属性名称(外部),m_updateInterval为控件IDC_EDIT_Interval的关联变量

DDX_Text(pDX, IDC_EDIT_Interval, m_updateInterval);

DDV_MinMaxShort(pDX, m_updateInterval, 0, 10000);

DDP_PostProcessing(pDX);

}

如果您有更好的方法,请留言,最好附图,谢谢。

添加事件:

对于vc添加事件,直接在cw里面添加事件即可(这方面vc太方便了):



在vs中需要右键Ctrl类,选择添加事件即可,会自动加载到lib下TestEvent中,不是在TestEvent上右键,它也没有此事件。

添加事件如下:


关于对封装的ocx的添加:

VC6.0环境下,添加activex控件很方便,而且包装类也会自动添加。
但是在vs2008环境下,取消了ClassWizard,其中的功能都被拆分了。
以Microsoft Chart Control , version 6.0 (OLEDB)这个控件为例,我的添加步骤是:
第一种方法:
菜单项目-> 添加类->选择ActiveX控件中的MFC类->弹出“从ActiveX控件添加类向导”对话框
-> 选择从文件添加类->选择路径“C:\windows\system32\mschrt20.ocx”(mschrt20.ocx是这个控件的文件)
->点击“>>”按钮添加所有接口(会弹出提示对话框说_DMSChartEvent这个接口找不到coclass)
->点击完成
->查看类视图,发现添加了许多类,其中的CDMSChart是最主要的类
->单击类视图中的CDMSChat类查看它的成员函数和成员变量,发现这个类的成员函数都正常,但是所有成员变量都看不到!!
第二种方法:
->在项目中随便创建一个对话框资源
->在对话框中右键->“插入ActiveX控件”->选择Microsoft Chart Control , version 6.0 (OLEDB)
(也可以在工具箱面板上右键->“选择项”->在弹出对话框中单击“COM组建”选项卡->找到Microsoft Chart Control , version 6.0 (OLEDB)打上复选标记确定->控件图标被添加到工具箱面板上可以直接拖放到对话框上)
->在对话框上右键这个控件->“添加变量”为对话框创建一个空间变量->IDL会自动创建此控件的包装类,CDMSChart.h和CDMSChart.cpp文件。
->在类视图中查看这个类,发现成员函数和成员变量都能正常显示。但是mschrt20.ocx其他接口的类没有被添加!!

试出这两中方法我都花了很长的时间,但是还是很不好用!
VS2008乃至VS2010真的是一种退步么?请明以教我.找到一种方法了:事件被隐藏了,使用方法二。点击右键add handle,会显示你的事件:


原创粉丝点击