2009-06-28 6 views
0

J'ai essayé de retourner une collection d'objets à partir de C# et d'y accéder via C++ via COM, mais j'ai échoué. J'ai essayé List List ArrayList et IDictionary et j'ai échoué.Comment retourner des objets de collection de C# et les accéder en C++?

j'ai essayé

How to return a collection of strings from C# to C++ via COM interop aussi, mais pas réussir.

tout organisme Aidez-moi

+0

Avez-vous essayé ce que Earwicker suggère (http://stackoverflow.com/questions/1032060/how-to-return-a-collection-of-strings-from-c-to-c-via-com-interop/ 1032356 # 1032356)? Si oui, qu'est-ce qui ne fonctionne pas? – sharptooth

Répondre

0

Que diriez-vous à l'aide d'un tableau à l'ancienne?

public interface IManaged 
{ 
    string[] ReturnArray(); 
} 

public class Managed : IManaged 
{ 
    public string[] ReturnArray() 
    { 
     return new string[] { "A", "B", "C" }; 
    } 
} 

Courir Tlbexp.exe avec ce fichier .dll crée un .tlb avec:

interface IManaged : IDispatch { 
    [id(0x60020000)] 
    HRESULT ReturnArray([out, retval] SAFEARRAY(BSTR)* pRetVal); 
}; 

Je ne l'ai pas testé en utilisant le .dll .exe natif, mais il semble prometteur :)

0

Il est normal que vous ne puissiez pas passer un objet de C# à C++ ou de C++ à C#. Un objet dans C# n'est pas un objet en C++. Ce que vous pouvez passer de C# à C++ sont des types comme bool, int et char. Aussi, attention à la taille des types ... par exemple un caractère dans C# est un wchar_t en C++.

2

@Partial, vous soulevez un point important. Vous ne pouvez pas renvoyer un "objet" .NET à C++ (à moins qu'il ne soit géré C++) car la sémantique de l'objet .NET n'est pas la même que la sémantique de l'objet C++.

@Cute: vous pouvez cependant passer des pointeurs d'interface COM. Si vous avez besoin de votre code "C++ traditionnel" pour parler aux objets .NET, utilisez des interfaces COM, pas des objets.

Assurez-vous que votre objet est marqué en tant qu'objet COM et que vous implémentez une interface appropriée contenant les méthodes dont votre C++ a besoin. Ensuite, transmettez un tableau des références de l'interface au code C++. Le code C++ doit obtenir un pointeur d'interface COM SafeArray, qu'il peut manipuler avec la sémantique COM habituelle (AddRef(), etc.).

+0

Cn donnez-moi un morceau de code pour avoir une idée. I Hav utilisé IDictionary également une interface générique mais filaed pour obtenir des valeurs en C++ – Cute

Questions connexes