0

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

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

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

4

1 回答 1

1

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

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

推荐阅读:

于 2010-05-06T00:41:45.423 回答