在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;
答案 0 :(得分:2)
此方法映射到C ++类型,而不是自动化类型。比较VT_BSTR情况,它将BSTR映射到CString。您的m_ProxEnabled变量应该是BOOL而不是VARIANT_BOOL。同样在此MSDN Library page中注明,请注意“属性类型”列。
反思很好,不是吗?