Convierte OleVariant a Object en Delphi
casting delphi-6 (2)
Intenta escribir "cast" en IUnknown primero.
tempSubclass := Subclass(ParentClass(Integer(IUnknown(oleVariantCast))));
Estoy trabajando en este proyecto donde no tenemos el código fuente para grandes porciones del proyecto, pero tenemos los archivos .DLL con cierta información. Hay un error en los archivos DLL. Puedo crear una subclase de la clase con el error y me gustaría bajar el objeto que ya existe en un punto donde tengo acceso. El problema es que en cualquier momento que tengo acceso al objeto, se lanza como una variante. He intentado lo siguiente (editado para eliminar el contexto):
tempSubclass := Subclass(ParentClass(Integer(oleVariantCast)));
pero me sale el siguiente error:
Could not convert variant of type (Dispatch) into type (Integer)
¿Hay alguna otra manera de sacar el puntero al objeto de OleVariant y / o hacer el encasillado involucrado?
Gracias.
EDITAR: Sí, Parentclass implementa IDispatch. CORRECCIÓN: Parentclass implementa una interfaz que hereda de IDispatch.
Una variante de envío es una interfaz bastante genérica, no una clase (que es la razón por la cual no puede ser encasillado a un objeto Delphi, no es uno, y no tiene el VMT para la clase que intentas lanzarlo convertirse).
Si el archivo DLL contiene una biblioteca de tipos, puede importar eso a Delphi y luego usar las interfaces que contiene directamente sin tratar de convertirlas a cualquier otra cosa primero.
Si tiene documentación sobre la implementación de la interfaz real en la DLL, puede escribir una clase Delphi que use esa interfaz. Puede convertirlo definiendo un tipo para representar la interfaz, y luego obtener acceso utilizando el 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;