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