1

C# でコンパイルされた Dll を使用する VB6 アプリケーションがあります。COM を使用してこの作業を行うことに成功しました。しかし、私の問題は、内部に String および Double データ型を含む Variant 配列があることです。この配列をオブジェクトとして受け取る C# Dll に渡す必要があります。したがって、Variant 配列を C# で "理解できる" オブジェクト配列に変換するだけです。誰にも手がかりがありますか?

4

4 に答える 4

2

これでうまくいくはずです

ArrayList a = new ArrayList(YourObjectArrayHere);
于 2009-12-23T18:08:46.380 に答える
2

これは、C# 側から行う必要があります。そうでない場合、VB6 からできることはあまりありません。つまり、デフォルトでは、メソッドは次のように宣言されています。

void Foo(object[] a);

VB6 からはVariant(または、IDL レベルでは のように) の配列を取るものとして認識されSAFEARRAY(VARIANT)ます。

そのように動作しない場合は、C# 宣言に何か問題があります。確認できるように投稿してください。

于 2009-12-23T18:16:03.497 に答える
0

これはC#関数宣言です:

public double[][] CalcMatching( object[][] data1, object[][] data2, long dataLen1, long dataLen2, string matchingType )

これはVB6呼び出しです:

result = matchingCalcObj.CalcMatching(data1, data2, dataLen1, dataLen2, Matching)

ここでdata1、およびdata2はVariantの配列です。

皆さんが言っているように、関数呼び出しで発生したエラーが「無効なプロシージャ呼び出しまたは引数」であると、C#では多くのことができるとは思いません。VB6側にオプションはありますか?

すべての返信をありがとう。

于 2009-12-23T18:42:11.310 に答える
0

object[] System.Runtime.InteropServices.Marshal.GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars)

この方法を試しましたか?

object[] result;
unsafe
{
  pin_ptr<object> pinObj = &obj;
  result = Marshal.GetObjectsForNativeVariants(new IntPtr(pinObj), objSize);
}

自分で試したことはありませんが、うまくいくようです。

于 2009-12-23T18:27:45.673 に答える