2009-08-13 69 views
0

我创建一个COM可调用.NET程序集,现在试图从传统的COM客户端使用它(VB6客户在我的情况)之间的用户定义类型的数组。编组了VB6和.NET

大会应公开API风格的界面,所以典型的函数声明应该是这样的:

int myRoutine (object inParam, out object result); 

问题是,当我试图使用函数声明为:

int GetMultipleItems (out ItemData[] itemList); 

在VB6这个翻译函数有数组作为参数传递,当我用'无效的过程调用或参数'调用它时失败。

实际通话的样子:

Dim items() As ItemData 
result = SCServer.GetMultipleItems (items) 

进一步调查,我试图标志着我的库的MarshalAs属性的几种不同的方式。从我的角度来看,问题是参数必须被传入并且 - 另一方面 - 要返回到VB代码的变体。

经过多次实验,我得到了以下的工作(1):

int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray, 
    SafeArraySubType = VarEnum.VT_DISPATCH)]out object[] itemList); 

(有项目()声明为在客户端对象)。

但我不得不使用正是我最初的签名(2),

int GetMultipleItems ([Out, MarshalAs (UnmanagedType.SafeArray, 
    SafeArraySubType = VarEnum.VT_DISPATCH)]out ItemData[] itemList); 

这并不与任何对象,或在客户端的ItemData数组类型的申报工作。

所以,问题是:
- 为什么(1)工作,而(2)没有。我应该在属性声明或客户改变什么让我在签名实际类型的工作(它暴露已出口到TLB以及一个接口,所以似乎都应该在这里OK)
- 什么是推荐的方法定义sugh [OUT]参数数组
- 也许我缺少一些基本的阅读,我将是...我仍然需要得到样品中一两天工作的联系表示感谢。

在此先感谢。

回答

0

您可以更改声明,以便返回对象数组,并且客户端可以从返回的内容中检索它们的数量。

ItemData[] GetMultipleItems() 
在你的方法

你既可以返回null或一个空数组(长度== 0),如果有没有。

或得到了数组返回并与计定义的变量。

ItemData[] GetMultipleItems(out int ItemsReturned) 

WinAPI风格的声明并不是在.NET API中声明方法等的一般方法。 (但我当然可能是错的)。

+0

我正在考虑将此作为选项。没有提到的问题 - 返回值不是真正的项目计数,它包含操作错误。如果没有其他办法,你的建议仍然可能有用 – 2009-08-14 08:11:50