Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2023, 15:01   #1
Rait-spider
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 15
По умолчанию Как передать ссылку на интерфейс при использовании автоматизации OLE

Добрый день всем!

Не определился,в какой раздел занести свой вопрос, поэтому пишу сюда.

Вопрос по использованию технологии OLE Automation. Есть интерфейс IWFBP, который непосредственно наследуется от IDispatch. Как я могу ссылку на этот интерфейс передать в стороннюю функцию, а в последующем использовать её? Допустим, у меня сейчас есть следующий код этой функции(пытаюсь использовать тип VARIANT):

Код:
void Func(VARIANT WFBL) {
   WFBL.Func1();
}
Здесь Func1 собственно функция интерфейса, WFBL - ссылка на него. Компилятор ругается, что он не видит Func1() в составе WFBL, причём ещё до компиляции. В чём может быть ошибка?

Пытался заменить VARIANT WFBL на IDispatch* WFBL, с последующим приведением переданного указателя к указателю на IWBP с помощью dynamic_cast. Предварительно импортировав библиотеку типов из нужной DLL. В этом случае компилятор уже видит Func1, но при написании чего-то вроде WFBL->Func1() во время выполнения вылезает ошибка Access violation с указанием на данную строку.

Буду признателен, если кто-то сможет помочь разобраться.
С++ - сила
Rait-spider вне форума Ответить с цитированием
Старый 17.07.2023, 12:59   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

VARIANT это union который хранит переменные разного типа.
Прочитайте про поле VARIANT:vt и про VARIANT:Disp
waleri на форуме Ответить с цитированием
Старый 19.07.2023, 03:27   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Rait-spider, dynamic_cast нельзя использовать с COM-интерфейсами. У них для этого есть метод QueryInterface. Надо как-то так:
Код:
void Func(IDispatch* w) {
  IWFBP* p;
  HRESULT r = w->QueryInterface(IID_IWFBP, reinterpret_cast<void**>(&p));
  if (SUCCEEDED(r)) {
    p->Func1();
    p->Release();
  }
}
Пётр Седов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как ссылку на изображение передать в аргументах? (React JS) в styled-components в background-image передать ссылку на изображение. ivan.tiran JavaScript, Ajax 2 17.02.2020 23:07
Передать ссылку в chrome nibufep Общие вопросы Delphi 2 13.12.2015 20:43
передать ссылку на процедуру в качестве строки xrob Общие вопросы Delphi 5 24.02.2013 18:14
COM-технология получить ссылку на интерфейс Sanprof Общие вопросы Delphi 3 16.07.2010 14:49
Как правильно передать через ссылку двумерный динамический массив? amerhant Общие вопросы C/C++ 2 21.04.2010 23:50