Visual Studio 2010上的BOOL / VARIANT_BOOL OLE接口错误

时间:2012-02-28 21:57:22

标签: c++ activex ole

在Visual Studio 2010下,我正在使用C ++开发64位ActiveX控件。我遇到了一个数据损坏错误,似乎根植于Microsoft库。经过这么多年,我无法相信图书馆中会存在这样一个明显的错误,我的分析也是正确的吗?

在.idl文件中,我定义了一个布尔属性:

 [id(44) , helpstring("Enable Proximity detection")] VARIANT_BOOL ProxEnabled

在头文件中,定义了属性:

void OnProxEnabledChanged(void);
VARIANT_BOOL m_ProxEnabled;

和OLE连接在这里:

DISP_PROPERTY_NOTIFY_ID(CmyCtrl, "ProxEnabled", dispidm_ProxEnabled, m_ProxEnabled, OnProxEnabledChanged, VT_BOOL)

当我从C#设置属性时,问题出现在我的代码中,它会破坏附近的内存:

  myControl.ProxEnabled = true;

问题的根源是Microsoft库oledisp1.cpp中的数据交换序列:

case VT_BOOL:
    *(BOOL*)pProp = (V_BOOL(pArg) != 0);
    break;

请注意,pProp被强制转换为指向 BOOL 的指针,而非 VARIANT_BOOL 。 BOOL定义为int,而VARIANT_BOOL定义为short。

在WinDef.h中:

typedef int                 BOOL;

在文件WTypes.h中:

/* 0 == FALSE, -1 == TRUE */
typedef short VARIANT_BOOL;

1 个答案:

答案 0 :(得分:2)

此方法映射到C ++类型,而不是自动化类型。比较VT_BSTR情况,它将BSTR映射到CString。您的m_ProxEnabled变量应该是BOOL而不是VARIANT_BOOL。同样在此MSDN Library page中注明,请注意“属性类型”列。

反思很好,不是吗?