Visual Studio 2010上的布尔/变量布尔OLE接口错误 在Visual Studio 2010下,我正在开发C++中的64位ActiveX控件。我遇到了一个数据损坏错误,该错误似乎源于Microsoft库。我不敢相信这么多年后图书馆里会存在这么明显的bug,那么我的分析正确吗

Visual Studio 2010上的布尔/变量布尔OLE接口错误 在Visual Studio 2010下,我正在开发C++中的64位ActiveX控件。我遇到了一个数据损坏错误,该错误似乎源于Microsoft库。我不敢相信这么多年后图书馆里会存在这么明显的bug,那么我的分析正确吗,c++,activex,ole,C++,Activex,Ole,在.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_ProxEnabl

在.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\u BOOL。BOOL定义为int,而VARIANT_BOOL定义为short

在WinDef.h中:

typedef int                 BOOL;
在文件WTypes.h中:

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

此方法映射到C++类型,而不是自动化类型。比较VT_BSTR案例,它将BSTR映射到CSTR。您的m_可执行变量应该是BOOL而不是VARIANT_BOOL。此外,请注意“属性类型”列


反射很好,不是吗?

那么,这确实是“添加属性”向导中的一个错误?唯一可用的BOOL类型属性是VARIANT\u BOOL,它会自动将成员创建为类型VARIANT\u BOOL。我不确定,这不是我使用过的向导。自动化类型应为VARIANT_BOOL,通过宏使用的支持变量应为BOOL。向导是否实际生成DISP\u PROPERTY\u NOTIFY\u ID宏?然后发布到connect.microsoft.com是的,这都是向导生成的。我将向connect.microsoft.com提交文件。谢谢您的回答。在WinForms应用程序中使用该控件时,我遇到了堆损坏的相同问题。谁会想到巫师错了!?