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

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中用鼠标操作,没有手动输入,了防止输入出错。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值