古怪的VARIANT_BOOL类型

在进行MFC的ActiveX控件编程时,肯定会遇到布尔型的属性。在VC7中对应的内部类型为VARIANT_BOOL,实际上是一个 short型的数据。实际使用过程中最容易碰到以下3个问题
1.在控件的 DoPropExchange( CPropExchange* pPX)中需要调用 PX_Bool函数,但是这个函数要求第3个参数为int型,可向导生成的变量就是VARIANT_BOOL型的,所以这里是需要进行强制类型转换的,例子如下:
 
if(pPX-> IsLoading())
  {
    PX_Bool(pPX, _T("CanFired"), ( int&)m_CanFired, VARIANT_FALSE);
  }
  else
  {
    PX_Bool(pPX, _T("CanFired"), ( int&)m_CanFired);
  }
 
2. 在代码的其他地方使用表示属性的变量时该如何确定其真假
  在VC中经常用BOOL来表示真假,其中1表示真,0表示假。可是m_CanFired变量由于是代表控件的属性的,是VARIANT_BOOL型的,它对应的关系是VARIANT_TRUE表示真(实际上是-1),VARIANT_FALSE表示假(实际上是0)。
  应该怎样判断呢?结果可能另人大跌眼镜,在除了 DoPropExchange( CPropExchange* pPX)的其他地方,还是得用TRUE(1), FALSE(0)来表示真假。而在VB中需要用VB自身的Boolean型变量的True, False来判断。这就是我们常说的 COM语言独立性
 
3.属性页的问题
  在VC7(2003版)里向导无法在属性页里帮你绑定变量,要手工完成DDP_Check的调用。而且还有个Bug,就是 DoDataExchange( CDataExchange* pDX)中的 DDP_PostProcessing(pDX)居然是放在函数第1行的,实际上应该放在 最后一行。同样,这里CheckBox只能绑定到BOOL型变量,这里用TRUE(1), FALSE(0)表示真假。
 
另附:
Windows 中BOOL变量常见的好几种类型:小写的bool,大写的BOOL ,还有VARIANT_BOOL 。
小写的bool 的是C++ 标准定义的布尔类型, 各个编译器处理的方式不同,Visual C++ 把bool 定为一个字节。小写的true 和 false 也都是C++ 标准定义的关键字。
大写的BOOL 是Windows 里面定义的布尔类型,实质上int, 在 windows 头文件面有定义:
typedef int BOOL;
#define TRUE 1
#define FALSE 0
 
VARIANT_BOOL 是COM 使用的布尔类型, 其实质上是 short 类型:
typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
 
可以看出, 3中BOOL类型的长度不一样,而且TRUE 和 FALSE 的值也不同,在相互转换的时候需要注意。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值