QueryInterface в компоненте VB6 возвращает E_NOINTERFACE только в отладчике - PullRequest
3 голосов
/ 23 ноября 2011

У меня есть интерфейс (ITask), который реализован COM-объектом VB6. У меня есть C ++ COM-объект, который использует интерфейс, и он обычно работает нормально.

Однако, когда я запускаю отладчик VB6 для отладки COM-объекта VB6, мой объект C ++ внезапно получает E_NOINTERFACE, когда он вызывает QueryInterface для объекта VB6 для интерфейса ITask.

Определение интерфейса:

[
    object,
    uuid(XXXX),
    pointer_default(unique),
    oleautomation
]

interface ITask : IUnknown
{
        [id(1)] HRESULT CreateTask([in, string] BSTR taskName);
}

C ++ код: hResult = pDisp->QueryInterface(IID_ITask, (void **) &m_pTaskApp);

(pDisp - это IDispatch * для COM-объекта VB6, который я получил посредством вызова другого компонента, который управляет временем жизни объекта)

Вызов QueryInterface для IID_IDispatch успешно выполняется, когда COM-объект VB6 выполняет отладчик.

Есть идеи?

РЕДАКТИРОВАТЬ - Добавить код VB6:

Implements ITask

Private Sub ITask_CreateTask(ByVal taskName as String)
    ' do stuff
End Sub

1 Ответ

1 голос
/ 27 ноября 2011

Ваше описание предполагает, что ваш компонент VB6 действительно содержит ваш класс (CLSID), но при отладке вы не получите компонент, который реализует тот же интерфейс, что и ваша скомпилированная версия.

Это, вероятно, связано с вашимнастройки совместимости в вашем компоненте VB6 COM.Вы можете изменить их в Project Properties-> Component в VB6.

По умолчанию установлено «Совместимость проекта».Когда вы выбираете эту опцию, то каждая новая версия вашего компонента будет использовать один и тот же идентификатор класса (CLSID), но получит новый идентификатор интерфейса.Это происходит, даже если все ваши публичные функции и свойства такие же, как в предыдущей версии.Обратите внимание, что это происходит как при компиляции проекта, так и при перезапуске в режиме отладки.См. http://support.microsoft.com/kb/161137 для описания режимов совместимости.

Чтобы решить вашу проблему, установите режим совместимости на Binary Compatibility.

...