MFC ActiveX 接口数据类型,伤不起!

要不是因为我一直在维护一个曲线绘制控件(www.st-curve.cn),我真的很不想再碰MFC的ActiveX了,其中怎一个乱字了得!

回想起来,似乎还是vc6最好,后来我相继升级到了vc2003 2008 2010,每次升级都让我很受伤!
注:MFC ActiveX以下简称控件。

这个乱,至少涉及到3个部件:
一:编译odl或者idl文件的编译器,它应该会生成控件的tlb文件(这属于ide组件);
二:从ocx或者tlb生成包装类的组件(也属于ide组件);
三:CWnd::InvokeHelper函数,这个在包装内中调用(由mfc库实现)。
这3个部件只要有一个出问题,那么将无法调用某个接口或者属性(通过包装类这种方法使用控件),下面我举一下例子(凭记忆的,这文章我没有在我的电脑上写):

一:LONGLONG属性(带LONGLONG参数的接口可能也一样),vc2010
这种数据类型,部件一和部件三都没有问题,问题出在部件二,它生成的包装类中,LONGLONG类型的地方,用的是VT_EMPTY,而不是VT_I8。
解决办法,手动修改包装类,把LONGLONG所在位置改为VT_I8(返回值)或者VTS_I8(参数)。

二:OLE_COLOR OLE_HANDLE类型
这两种数据在vc6 vc2003 vc2008下运行良好,但似乎做了一些手脚:
本来OLE_COLOR和OLE_HANDLE都是无符号的,前者被定义为DWORD,后者被定义为UINT,但在DISP_FUNCTION_ID中,却被映射为VTS_COLOR和VTS_HANDLE,而它们都被定义为VTS_I4,也就是说,变成了有符号型,此时部件二做了一些手脚,让生成的包装类里面,VTS_COLOR和VTS_HANDLE都被改成了VTS_I4(如果是返回值,就是VT_COLOR和VT_HANDLE,则改成了VT_I4,以后不再说明),这也保证了控件可以使用了。
但在vc2010中,DISP_FUNCTION_ID中仍然是VTS_COLOR和VTS_HANDLE,它们也仍然被定义为VTS_I4,但在生成的包装类里,却都被改写为VTS_UI4(根据tlb来看,这才是正确的,VT_I4才有问题,因为tlb中用的是OLE_COLOR和OLE_HANDLE数据类型),居然也能运行,我觉得是部件三做了手脚(因为这个数据类型根本不匹配DISP_FUNCTION_ID)。
那么既然VTS_COLOR支持,那VTS_PCOLOR,也当然支持吧,错,vc2010不支持,在vc6 vc2003 vc2008下VTS_PCOLOR在生成的包装类里面被改写为VTS_PI4(匹配了DISP_FUNCTION_ID,却并不匹配tlb,前面说过了),没有问题,但在vc2010下,却被改写为VTS_PUI4(跟VTS_COLOR一样,匹配了tlb,却不匹配DISP_FUNCTION_ID),也没有问题,可是调用的时候,无法调用,类型不匹配,看来部件三的手脚做得还不够!

三:VT_U VT_PU系列数据类型
比如VT_UI1 VT_PUI4等,这些在vc6下好像是没有的,我不知道是哪个版本添加的,最好别使用,当控件在vc6中使用时,可能会无法生成包装类。

四:还有很多的乱,不一一列举了,都跟上面差不多,只是数据类型不一样而已,vc2010 BUG出奇的多,难道这些传统的东西,微软真的不想要了吗?那保持原样也可以啊,改的东西不多,却出一堆BUG,很不理解。
最讽刺的是,大家可以这样做一个实验:添加一个接口,里面带一个OLE_COLOR*类型的参数,编译,然后在vc2010里面的另一个工程中使用,你会发现,它无法调用这个接口,因为参数类型不匹配,相反,把这个控件在vc6中使用,反而可以!微软,你在搞什么飞机?

注:以后我所添加的属性和接口,全部在ide中用鼠标操作,没有手动输入,了防止输入出错。

MFC ActiveX 接口数据类型,伤不起!相关推荐

  1. VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

    VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是 ...

  2. MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)

    2019独角兽企业重金招聘Python工程师标准>>> 一:在VB中调用X控件,添加方法 project->Add components.另外可以用Object Browser ...

  3. C++ 使用VS2010创建MFC ActiveX工程项目

    1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...

  4. vs2017开发ActiveX(主讲OCX)(十一)、类向导中MFC ActiveX添加方法、添加函数、添加变量、添加事件、添加属性、添加方法的区别

    本文我们就来说说类向导中MFC ActiveX添加方法.添加函数.添加变量.添加事件.添加属性.添加方法的区别.这个问题曾经困扰过我. 此处是向CCreateOcxDemoApp类中添加成员变量,及成 ...

  5. VS2017创建MFC ActiveX工程制作IE OCX插件

    最近看了一个采用MFC ActiveX封装DLL的OCX项目的源码,现将学习到的内容记录下来.本次的学习记录计划写如下几个主题: 1.VS2017创建MFC ActiveX工程制作IE OCX插件 2 ...

  6. MFC ActiveX ISafeObject的实现

    转载自:https://blog.csdn.net/jiangtongcn/article/details/13629017 默认情况下,编译的MFC Activex控件,只能在本地代码中运行,即便是 ...

  7. MFC ActiveX (ocx)控件的开发

    前言 ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM). ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个 ...

  8. VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件

    VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件 参考文章: (1)VS2008 在IE8中 调试 Acti ...

  9. mfc随记:基于vs2010创建MFC ActiveX控件并测试

    一.新建一个空项目 以管理员打开vs2010,选择新建一个mfc activeX控件,填写项目名称和路径,其他无需修改,直接默认一直下一步即可 二. 添加测试方法 在底部tab栏切换到类视图,右键添加 ...

最新文章

  1. css选择器匹配没有属性x的元素[重复]
  2. android压缩图片不失真,Android压缩图片到100K以下并保持不失真的高效方法 - feicien的博客 - eoe移动开发者社区...
  3. c语言编程中怎么打汉字,c语言编程中,怎么打汉字啊??我是新手啊~~
  4. .NET 中密封类的性能优势
  5. 数据科学与大数据技术的案例_作为数据科学家解决问题的案例研究
  6. 美的集团:收购KUKA总价款为15亿欧元
  7. vue-element-admin 设置默认语言
  8. 碰撞与鲜血:人类与自动驾驶的坎坷摩擦
  9. element ui下拉框实现
  10. python的unicode编码表_Python-编码
  11. 二维图片做出三维效果
  12. 滴滴出行小程序体积优化实践
  13. react获取当前路由
  14. 第1关:伪分布式环境搭建
  15. kinect深度距离误差_TOF相机深度矫正基于Kinect v2
  16. 经典CNN结构论文阅读:AlexNet
  17. fpga的EPCS 配置的2种方法(图文讲解,哈哈,网上互相抄袭的一些文字说明太不明了了)
  18. Android NV21与Bitmap相互转换 可实时添加水印
  19. 1.10HDFS 回收站机制
  20. UCC27201DDAR

热门文章

  1. 拯救你的专注力,提高生产效率的终极方法,没有之一!!!
  2. apache评分标准,简论毕业论文(标准格式)_APACHE评分系统评分表
  3. 工业用微型计算机自考试卷,自考工业用微型计算机试四卷历年真题.doc
  4. 博客园主页上添加Live 2D模型
  5. 体验 .NET MAUI RC3 ,马上就要发布RTM
  6. 如何每天早晨5点起床
  7. 那一科技c语言笔试,苏州科技学院c语言末考试笔试试卷.doc
  8. Linux 命令(213)—— ip 命令
  9. 19Siggraph 交互式手姿态估计使用拉伸传感软手套 文献阅读
  10. 注重平常的点滴关心,迷迷糊糊的实践着一切成交都是因为爱。