В Visual Studio 2010 я разрабатываю 64-разрядный элемент управления ActiveX на C ++.Я столкнулся с ошибкой повреждения данных, которая, кажется, коренится в библиотеке 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;