gpt4 book ai didi

c++ - Visual Studio 2010 上的 BOOL/VARIANT_BOOL OLE 接口(interface)错误

转载 作者:行者123 更新时间:2023-11-30 04:29:18 26 4
gpt4 key购买 nike

在 Visual Studio 2010 下,我正在使用 C++ 开发 64 位 ActiveX 控件。我遇到了一个似乎源于 Microsoft 库的数据损坏错误。这么多年了,真不敢相信库里居然还有这么明显的bug,我的分析对吗?

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

 [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;

问题的根源是微软库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;

最佳答案

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

反射很好,不是吗?

关于c++ - Visual Studio 2010 上的 BOOL/VARIANT_BOOL OLE 接口(interface)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9490376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com