J'ai un objet COM ATL que j'utilise à partir de C#. L'interface ressemble actuellement à:Comment passer un tableau de structures (contenant std: string ou BSTR) d'ATL à C#. SafeArray? Une variante?
interface ICHASCom : IDispatch{
[id(1), helpstring("method Start")] HRESULT Start([in] BSTR name, [out,retval] VARIANT_BOOL* result);
...
[id(4), helpstring("method GetCount")] HRESULT GetCount([out,retval] LONG* numPorts);
...
[id(7), helpstring("method EnableLogging")] HRESULT EnableLogging([in] VARIANT_BOOL enableLogging);
};
C'est, c'est une interface très simple. J'ai aussi quelques événements que je renvoie aussi. Maintenant, j'aimerais ajouter quelque chose à l'interface. Dans l'ATL j'ai quelques résultats, qui sont actuellement structs et ressemblent à struct REPORT_LINE { chaîne creationDate; chaîne Id; résumé de la chaîne; }; Tous les membres de la structure sont std :: string. J'en ai un tableau dont j'ai besoin pour revenir au C#. Quelle est la meilleure façon de faire cela?
Je suppose que quelqu'un va dire, "hé, vous ne pouvez pas envoyer std :: string sur COM comme ça, si c'est le cas, bien, mais quelle est la meilleure façon de modder la structure? Chaîne à BSTR? Et puis comment puis-je, 1) Configurer l'IDL pour passer un tableau de structures (structs avec BSTR ou std :: string) 2) Si je dois utiliser SAFEARRAYS, comment puis-je remplir le SAFEARRAYS avec le struct.
Je ne suis pas familier avec COM sauf pour une utilisation avec des types simples.
Merci pour la réponse rapide , Je lis vos suggestions.Une question rapide: j'ai joué un peu plus et a été en mesure de trouver ce qui suit: interface ISimpl eCom: IDispatch { \t \t [id (1), helpstring ("méthode Test2")] HRESULT Test2 ([dans, out] SAFEARRAY (struct MyStruct) param); }; où MyStruct est: struct MyStruct { \t \t long nLongValue; \t BSTR bstrStringValue; }; Cela a bien fonctionné à partir de C#. Il n'aurait pas dû se baser sur vos suggestions et vos lectures (ou est-ce que l'automatisation de SAFEARRAY est conforme?). C#: SafeArrayPlayLib.MyStruct [] myArray = nouveau MyStruct [2]; com.Test2 (myArray); Cordialement, Dave – Dave
mis à jour sur les structures –
Merci Sheng.Je n'utiliserai pas ce composant COM avec Script, juste C#. Merci pour votre aide. Il est difficile d'obtenir de l'aide sur COM ces jours-ci; c'est une vieille technologie. – Dave