BOOL / VARIANT_BOOL OLE Ошибка интерфейса в Visual Studio 2010 - PullRequest
1 голос
/ 29 февраля 2012

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

1 Ответ

2 голосов
/ 29 февраля 2012

Этот метод сопоставляется с типами C ++, а не с типами автоматизации. Сравните случай VT_BSTR, он отображает BSTR в CString. Ваша переменная m_ProxEnabled должна быть BOOL вместо VARIANT_BOOL. Также указано на этой странице библиотеки MSDN , обратите внимание на столбец "Тип свойства".

Отражение это хорошо, не правда ли?

...