Конвертировать OleVariant в Object в Delphi - PullRequest
0 голосов
/ 14 марта 2011

Я работаю над этим проектом, где у нас нет исходного кода для больших частей проекта, но у нас есть файлы .DLL с некоторой информацией. В файлах DLL есть ошибка. Я могу создать подкласс класса с ошибкой в ​​нем, и я хотел бы уменьшить значение объекта, который уже существует в точке, к которой у меня есть доступ. Проблема в том, что в любой момент у меня есть доступ к объекту, он разыгрывается как вариант. Я пробовал следующее (отредактировано для удаления контекста):

tempSubclass := Subclass(ParentClass(Integer(oleVariantCast)));

но я получаю следующую ошибку:

Could not convert variant of type (Dispatch) into type (Integer)

Есть ли другой способ получить указатель на объект из OleVariant и / или выполнить ли приведение типа?

Спасибо.

РЕДАКТИРОВАТЬ: Да, Parentclass реализует IDispatch. ИСПРАВЛЕНИЕ: Родительский класс реализует интерфейс, который наследуется от IDispatch.

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Попробуйте сначала привести тип к IUnknown.

tempSubclass := Subclass(ParentClass(Integer(IUnknown(oleVariantCast))));
1 голос
/ 14 марта 2011

Вариант рассылки - это довольно общий интерфейс, а не класс (вот почему он не может быть приведен по типу к объекту Delphi - он не один и не имеет VMT для класса, который вы пытаетесьчтобы преобразовать его в).

Если DLL содержит библиотеку типов, вы можете импортировать ее в Delphi, а затем использовать содержащиеся в ней интерфейсы напрямую, не пытаясь сначала преобразовать их во что-либо еще.* Если у вас есть документация о фактической реализации интерфейса в DLL, вы можете написать класс Delphi, который использует этот интерфейс.Вы можете преобразовать его, определив тип для представления интерфейса, а затем получить к нему доступ, используя as:

type
  TYourInterface=interface(IDispatch)
    // the interface definition here
  end;

var
  Intf: TYourInterface;
begin
  Intf := YuorOleVariant as TYourInterface;
  // work with interface from DLL using Intf.
  Intf := nil;
end;
...