我有一个我在C#中使用的ATL COM对象。界面目前看起来像:
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);
};
也就是说,它是一个非常简单的界面。我也有一些我发回的活动。 现在,我想在界面上添加一些东西。在ATL我有一些结果,这些结果目前是结构和看起来像 struct REPORT_LINE { string creationDate; 字符串Id; 字符串摘要; }; 结构的所有成员都是std :: string。我有一些这些我需要回到C#。最好的方法是什么?
我怀疑有人会说,“嘿,你不能像这样在COM上发送std :: string。如果是这样,很好,但修改结构的最佳方法是什么?更改std :: string到BSTR?然后我怎么样, 1)设置IDL以传递结构数组(使用BSTR或std :: string的结构) 2)如果我必须使用SAFEARRAYS,我如何用结构填充SAFEARRAYS。
除了使用简单类型之外,我不熟悉COM。
答案 0 :(得分:1)
用户定义的结构与自动化接口不兼容。您可以设计出嵌套数组或BSTR的二维安全数组,但更易于维护的解决方案是将结构包装为具有3个属性的自动化对象,然后将数组包装为具有枚举器的集合。
IDL和Automation都没有为结构定义字节对齐。因此,如果COM服务器与客户端具有不同的结构对齐,则可能存在兼容性问题。例如VB具有4字节对齐,而Visual C ++中的#import默认为8字节对齐。如果您将来有机会在脚本中使用该接口,请避免使用结构。
建议阅读: