2010-05-05 20 views
0

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.

Répondre

1

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 , b Une solution plus facile à gérer consiste à envelopper la structure en tant qu'objet Automation avec 3 propriétés, puis envelopper le tableau dans une collection dotée d'un énumérateur. Ni IDL ni Automation ne définissent l'alignement des octets pour un struct. Vous pouvez donc avoir des problèmes de compatibilité si votre serveur COM a un alignement de structure différent avec le client. par exemple. VB a un alignement de 4 octets, tandis que l'importation # dans Visual C++ par défaut à un alignement de 8 octets. Si vous avez la moindre chance d'utiliser l'interface dans les scripts, évitez d'utiliser des structures.

Suggestions de lecture:

+0

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

+0

mis à jour sur les structures –

+0

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