Com 如何将结构数组(包含std:string或BSTR)从ATL传递到C#。安全阵列?变体?
我有一个ATL COM对象,我正在从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]
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页