2009-11-12 10 views
0

Je souhaite ajouter une méthode acceptant IStream* à mon interface COM. Voici l'extrait de IDL:Ajout d'un espace de nommage bizarre lors de l'importation d'un typelib

import "oaidl.idl"; 
import "ocidl.idl"; 
import "objidl.idl";//IStream is declared in this .idl file 
[ 
    uuid(uuidhere), 
    version(1.0) 
] 
library MyLibrary 
{ 
    importlib("stdole32.tlb"); 
    importlib("stdole2.tlb"); 
    [ 
    object, 
    uuid("interfaceid"), 
    dual, 
    nonextensible, 
    oleautomation, 
    hidden 
    ] 
    interface IMyInterface : IUnknown { 
     HRESULT LoadStream([in] IStream* stream); 
     HRESULT LoadUnknown([in] IUnknown* unkn); 
    }; 
} 

Je compiler le fichier .idl et importer le typelib dans un autre projet.

Lorsque je passe en revue le .tlb dans le fichier OLEView, je vois que le IStream est déclaré dans mon typelib mais pas IUnknown. Cela provoque des problèmes - lorsque j'essaie d'appeler IMyInterface::LoadStream() dans un autre projet C++ dit qu'il ne peut pas convertir IStream* en MyLibrary::IStream*. Dans le même temps, il ne se plaint pas de IUnknown.

Pourquoi MIDL place-t-il la définition IStream dans la typelib et ne la traite pas comme une définition globale?

+0

FYI, ocidl.idl importe oaidl.idl, oaidl.dil importe objidl.idl et objidl.idl importe unknwn.idl. Vous avez juste besoin d'importer ocidl.idl. –

Répondre

0

Vous avez deux IStreams, un global (déclaré dans objidl.idl), un autre dans l'espace de noms MyLibrary (déclaré dans votre idl). Supprimez celui de l'espace de noms MyLibrary.

Si vous envisagez de prendre en charge les clients de script, je vous suggère également d'exposer une interface IDispatch car IStream n'est pas pris en charge par les langages de script.

+0

Voilà ce que je ne comprends pas. Que dois-je faire pour supprimer la déclaration in-typelib? – sharptooth

+0

supprime la déclaration IStream de idl. –

+0

Si je supprime l'importation "objidl.idl" le comportement reste le même. Que puis-je faire d'autre? – sharptooth