如何将结构数组(包含std:string或BSTR)从ATL传递给C#。安全数组?变异?

时间:2010-05-05 17:09:37

标签: com interface atl safearray atlcom

我有一个我在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;     字符串摘要; }; 结构的所有成员都是st​​d :: string。我有一些这些我需要回到C#。最好的方法是什么?

我怀疑有人会说,“嘿,你不能像这样在COM上发送std :: string。如果是这样,很好,但修改结构的最佳方法是什么?更改std :: string到BSTR?然后我怎么样, 1)设置IDL以传递结构数组(使用BSTR或std :: string的结构) 2)如果我必须使用SAFEARRAYS,我如何用结构填充SAFEARRAYS。

除了使用简单类型之外,我不熟悉COM。

1 个答案:

答案 0 :(得分:1)

用户定义的结构与自动化接口不兼容。您可以设计出嵌套数组或BSTR的二维安全数组,但更易于维护的解决方案是将结构包装为具有3个属性的自动化对象,然后将数组包装为具有枚举器的集合。

IDL和Automation都没有为结构定义字节对齐。因此,如果COM服务器与客户端具有不同的结构对齐,则可能存在兼容性问题。例如VB具有4字节对齐,而Visual C ++中的#import默认为8字节对齐。如果您将来有机会在脚本中使用该接口,请避免使用结构。

建议阅读: