Последние записи
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
19th
Июл
Как передать ссылку на интерфейс при использовании автоматизации OLE
Posted by obzor under c/c++
Вопрос по использованию технологии 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 с указанием на данную строку.
Буду признателен, если кто-то сможет помочь разобраться.
VARIANT это union который хранит переменные разного типа.
Прочитайте про поле VARIANT:vt и про VARIANT::pDisp
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();
}
}
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)