2009-11-16 4 views
2

J'ai un assembly .NET. Il arrive d'être écrit en C++/CLI. J'expose quelques objets via COM. Tout fonctionne bien, mais je ne peux pas pour la vie de moi comprendre comment retourner un tableau de mes propres objets d'une méthode. Chaque fois que je le fais, j'obtiens une erreur d'incompatibilité de type à l'exécution. Je peux retourner un tableau d'ints ou de cordes très bien.Comment retourner un tableau d'objets .NET via une méthode COM

Voici ma classe principale

[Guid("7E7E69DD-blahblah")] 
[ClassInterface(ClassInterfaceType::None)] 
[ComVisible(true)] 
public ref class Foo sealed : IFoo 
{ 
public: 
    virtual array<IBar^>^ GetStuff(); 
} 

[Guid("21EC1AAA-blahblah")] 
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)] 
[ComVisible(true)] 
public interface class IFoo 
{ 
public: 
    virtual array<IBar^>^ GetStuff() 
    { 
     // For simplicity, return an empty array for now. 
     return gcnew array<IBar^>(0); 
    } 
}; 

Voici la classe je rentrais

[Guid("43A37BD4-blahblah")] 
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)] 
[ComVisible(true)] 
public interface class IBar 
{ 
    // Completely empty class, just for testing. 
    //In real life, I would like to return two strings and an int. 
}; 

[Guid("634708AF-blahblah")] 
[ClassInterface(ClassInterfaceType::None)] 
[ComVisible(true)] 
[Serializable] 
public ref class Bar : IBar 
{ 
}; 

Ceci est mon (natif) code C++ qui appelle:

MyNamespace::IFooPtr session(__uuidof(MyNamespace::Foo)); 
// For simplicity, don't even check the return. 
session->GetStuff(); 

appel GetStuff() me donne un _com_error 0x80020005 (DISP_E_TYPEMISMATCH). Je peux dire que ma méthode est appelée correctement, c'est juste que quand .NET/COM va aller chercher le retour, ça étouffe. Comme je l'ai dit, cela fonctionne bien avec des tableaux d'entrailles ou de cordes. Qu'est-ce que je dois faire à ma classe pour permettre son retour dans un tableau? En l'occurrence, ma classe ne contiendra que quelques chaînes et un int (pas de méthode), si cela facilite la tâche. Évidemment, j'ai essayé de retourner un tableau non vide et des classes qui contiennent effectivement des données, c'est juste le cas le plus simple qui illustre le problème.

Répondre

0

Vous devez mettre en œuvre IDispatch et la méthode Enumerator

public ref class FooCollection{ 
[DispId(-4)] 
public IEnumerator^ GetEnumerator() 
{ 
//... 
} 
} 
+0

donc je ne peux pas retourner un tableau, je dois écrire ma propre classe de collection et d'exposer cela? Décevant, mais je suppose pas trop difficile. – mhenry1384

+0

@ mhenry1384, si [cette réponse] (http://stackoverflow.com/a/6340144/12048) est correcte alors cela devrait être possible. – finnw

Questions connexes