0

COM 呼び出し可能な .net アセンブリを作成していて、レガシー COM クライアント (私の場合は VB6 クライアント) から使用しようとしています。

アセンブリは 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);  

(items() がクライアント側で Object として宣言されている)。

しかし、最初の署名 (2) を正確に使用する必要があります。

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

オブジェクトまたはクライアントでの ItemData 配列型宣言では機能しません。

したがって、質問は次のとおりです
。-なぜ(1)は機能するのに(2)は機能しないのですか。署名の実際の型を操作するには、属性宣言またはクライアントで何を変更する必要がありますか (tlb にもエクスポートされたインターフェイスを公開するため、ここではすべて問題ないようです)
- sugh を定義する推奨される方法は何ですか? [out] パラメータ配列
- 重要な読み物が不足している可能性があります。リンクに感謝します... それでも、1 日か 2 日でサンプルを機能させる必要があります。

前もって感謝します。

4

1 に答える 1

0

オブジェクトの配列を返し、クライアントが返されたものからそれらの数を取得できるように、宣言を変更できますか。

ItemData[] GetMultipleItems()

メソッドでは、何もない場合は Null または空の配列 (長さ == 0) を返すことができます。

または配列が返され、カウントで定義された変数があります。

ItemData[] GetMultipleItems(out int ItemsReturned)

WinAPI スタイルの宣言は、.NET API でメソッドなどを宣言する通常の方法ではありません。(もちろん、私は間違っている可能性があります)。

于 2009-08-14T02:07:53.717 に答える