Comment puis-je passer un tableau de struct (contenant std: chaîne ou BSTR) de ATL à C #. SafeArray? Une variante?

StackOverflow https://stackoverflow.com/questions/2775299

Question

J'ai un objet ATL COM que j'utilise de C #. L'interface ressemble actuellement:

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, il est une interface très simple. J'ai aussi quelques événements que je renverrai aussi. Maintenant, je voudrais ajouter quelque chose à l'interface. Dans l'ATL j'ai des résultats, qui sont actuellement struct et ressemblent à struct REPORT_LINE {     creationDate chaîne;     Id chaîne;     Résumé de la chaîne; }; Tous les membres de la structure sont std :: string. J'ai un tableau de ces que je dois retourner au C #. Quelle est la meilleure façon de le faire?

Je soupçonne que quelqu'un va dire: « Hé, si oui, très bien, mais ce qui est la meilleure façon de modidfy struct? Changez le std :: string vous ne pouvez pas envoyer std :: string sur COM comme ça. à BSTR? Et comment puis-je, 1) Mettre en place le IDL pour passer un tableau de structs (structs avec BSTR ou std :: string) 2) Si je dois utiliser SafeArrays, comment puis-je remplir les SafeArrays avec les struct.

Je ne suis pas familier avec COM sauf pour une utilisation avec des types simples.

Était-ce utile?

La solution

une structure définie par l'utilisateur est incompatible avec l'interface d'automatisation. Vous pouvez probablement travailler un tableau imbriqué ou deux tableau sécurisé dimensions de BSTRs, mais une solution plus maintenable serait envelopper la structure comme un objet d'automatisation avec 3 propriétés, puis enveloppez le tableau comme une collection qui a un recenseur.

Ni IDL, ni l'automatisation définissent l'alignement octet pour un struct. Ainsi, vous pouvez avoir des problèmes de compatibilité si votre serveur COM a alignement différent struct avec le client. par exemple. VB a un alignement de 4 octets, tandis que l'import dans le défaut de Visual C pour un alignement de 8 octets. Si vous avez une moindre chance à l'avenir d'utiliser l'interface dans les scripts, évitez d'utiliser struct.

Lecture suggérée:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top