Com 如何将结构数组(包含std:string或BSTR)从ATL传递到C#。安全阵列?变体?

Com 如何将结构数组(包含std:string或BSTR)从ATL传递到C#。安全阵列?变体?,com,interface,atl,safearray,atlcom,Com,Interface,Atl,Safearray,Atlcom,我有一个ATL COM对象,我正在从C#使用它。该界面当前看起来像: 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]

我有一个ATL COM对象,我正在从C#使用它。该界面当前看起来像:

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中,我有一些结果,它们当前是结构,看起来像 结构报告行 { 弦肌; 字符串Id; 字符串摘要; }; 结构的所有成员都是std::string。我有一个数组,我需要回到C。最好的方法是什么

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


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

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

< Idl和AutoDe]都不为Stutt定义字节对齐。如果COM服务器与客户端有不同的结构对齐,则可以有兼容性问题。例如VB具有4字节对齐,而VisualC++中的“导入”默认为8字节对齐。如果在将来有一点机会在脚本中使用接口,AVoid使用结构

建议如下:

  • *
  • *ATL内部:Chris Tavares编写的ATL 8,Kirk Fertitta第392页

感谢您的快速回复,我正在阅读您的建议。一个简短的问题:我又玩了一些,并且能够想出以下内容:接口ISimpleCom:IDispatch{[id(1),helpstring(“methodtest2”)]HRESULT Test2([in,out]SAFEARRAY(struct MyStruct)param);};其中MyStruct是:struct MyStruct{long nLongValue;BSTR bstrStringValue;};这在C#看来效果很好。它不应该基于您的建议和阅读(或者是否符合SAFEARRAY automation?)。C#:SafeArrayPlayLib.MyStruct[]myArray=newmystruct[2];Test2(myArray);你好,戴维生。我不会在脚本中使用这个COM组件,只使用C。谢谢你的帮助。现在很难在COM上获得帮助;这是老技术。