2010-05-05 74 views
0

我有一个ATL COM对象,我从C#使用。界面目前看起来像:如何从ATL传递一个结构数组(包含std:string或BSTR)到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中我有一些结果,它们目前是结构体,看起来像 struct REPORT_LINE string creationDate; 字符串ID; 字符串摘要; }; 结构的所有成员都是st​​d :: string。我有一些这些我需要回到C#。什么是最好的方法来做到这一点?

我怀疑有人会说:“嘿,你不能只是发送的std :: string过这样的COM。如果是这样,不错,但什么是对modidfy的结构?改变STD的最佳方式::字符串到BSTR?然后我怎么做, 1)设置IDL传递结构数组(结构与BSTR或std ::字符串) 2)如果我必须使用SAFEARRAYS,如何填充SAFEARRAYS与结构。

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

回答

1

一个用户定义的结构是与自动化接口不兼容,你可能可以制定出一个嵌套的数组或两个BSTRs的二维安全数组,b如果一个更可维护的解决方案是将结构作为具有3个属性的自动化对象进行包装,然后将该数组作为具有枚举器的集合进行包装。

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

推荐阅读:

+0

感谢您的快速反应,我正在阅读你的建议。一个简单的问题:我打了更多 ,并能够拿出以下内容: interface ISimpl eCom:IDispatch {[1],helptring(“method Test2”)]] HRESULT Test2([in,out] SAFEARRAY(struct MyStruct)param); }; 其中MyStruct是: struct MyStruct { \t \t long nLongValue; \t BSTR bstrStringValue; }; 这从C#工作得很好。它不应该基于您的建议和阅读(或SAFEARRAY自动化兼容?)。 C#: SafeArrayPlayLib.MyStruct [] myArray = new MyStruct [2]; com.Test2(myArray); Regards,戴夫 – Dave 2010-05-07 15:44:47

+0

更新结构 – 2010-05-07 17:47:39

+0

谢谢。我不会在脚本中使用这个COM组件,只是C#。感谢所有的帮助。这些天很难在COM上获得帮助;这是旧技术。 – Dave 2010-05-07 22:54:27