2009-08-13 73 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