我有一个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; 字符串摘要; }; 结构的所有成员都是std :: string。我有一些这些我需要回到C#。什么是最好的方法来做到这一点?
我怀疑有人会说:“嘿,你不能只是发送的std :: string过这样的COM。如果是这样,不错,但什么是对modidfy的结构?改变STD的最佳方式::字符串到BSTR?然后我怎么做, 1)设置IDL传递结构数组(结构与BSTR或std ::字符串) 2)如果我必须使用SAFEARRAYS,如何填充SAFEARRAYS与结构。
我不熟悉COM除了简单的类型使用。
感谢您的快速反应,我正在阅读你的建议。一个简单的问题:我打了更多 ,并能够拿出以下内容: 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
更新结构 – 2010-05-07 17:47:39
谢谢。我不会在脚本中使用这个COM组件,只是C#。感谢所有的帮助。这些天很难在COM上获得帮助;这是旧技术。 – Dave 2010-05-07 22:54:27