2010-05-05 3 views
2

Existe-t-il un moyen de passer un wrapping et de déballer un descendant TObject dans un OleVariant? J'essaye de passer un TObject à travers des objets d'automation. Je sais que ce n'est pas une bonne idée mais je n'ai pas une bonne alternative.Diffuser un objet comme OleVariant dans Delphi

L'objet doit être transmis entre les objets de la même DLL d'automatisation, si cela fait une différence.

Quelque chose comme ceci:

function GetMyObjAsVariant; 
var 
    MyObj: TMyObj; 
begin 
    MyObj := TMyObj.Create; 
    result := OleVariant(MyObj); 
end; 

qui serait utilisé par un client comme

var 
    MyObj: TMyObj; 
begin 
    MyObj := GetMyObjAsVariant as TMyObj; 
end; 

Cela ne peut pas compiler, retour

E2015 Operator not applicable to this operand type. 

Répondre

2

Si vous absolument, vraiment envie, et vous savez que les deux objets sont dans le même processus, vous pouvez lancer une TObject à un nombre entier, puis revenir à un TObject:

function GetMyObjAsVariant; 
var 
    MyObj: TMyObj; 
begin 
    MyObj := TMyObj.Create; 
    result := OleVariant(Integer(MyObj)); 
end; 

puis: Laisser votre objet implémenter une interface et passer l'interface.

var 
    anInt: Integer; 
    MyObj: TMyObj; 
begin 
    anInt := GetMyObjAsVariant; 
    MyObj := TMyObj(anInt); 
end; 
+0

Comme dit: ceci ne fonctionne que dans le même processus. Donc seulement dans les objets COM de processus (dll)! –

+0

C'est le hack que je cherchais! Les autres réponses étaient bonnes aussi, mais cela répond à mon besoin immédiat, merci. –

+0

S'il s'agit d'une DLL COM in-process, pourquoi vous obligez-vous à OLEVariant en premier lieu? Il suffit de coller aux types compatibles avec l'automatisation si vous fournissez une interface de répartition (pour les clients d'automatisation). Avec une DLL COM en cours de processus, je pense que vous pouvez simplement vous désengager de la sécurité de type automatisation et transmettre directement votre TObject. Mais il y a longtemps que j'ai fait COM à ce niveau, donc je me trompe peut-être. – Deltics

4

Vous pouvez écrire et enregistrer une coutume Type de variante; jetez un oeil à TSQLTimeStampVariantType pour un exemple.

Une alternative serait d'écrire un wrapper d'automatisation pour votre classe. La double dispinterface prend automatiquement en charge la liaison tardive via IDispatch, qui est prise en charge par OleVariant.

+0

+1 pour le wrapper d'automatisation –

2

function GetMyObjAsVariant: OleVariant; 
var 
    MyObj: IMyObj; 
begin 
    MyObj := TMyObj.Create; 
    result := MyObj; 
end; 

var 
    MyObj: IMyObj; 
begin 
    MyObj := GetMyObjAsVariant as IMyObj; 
end; 

Je ne garantit pas que cela fonctionne, vous devriez aller avec la suggestion de TOndrej et faire une enveloppe d'automatisation pour votre classe. Cela ne devrait pas être dur si vous connaissez votre chemin.

Questions connexes