C# 将VB6变量指定给对象

C# 将VB6变量指定给对象,c#,vb6,object,variant,C#,Vb6,Object,Variant,我有一个VB6应用程序,它使用C编译的Dll。我通过COM成功地完成了这项工作。 但我的问题是,我有一个变量数组,其中包含字符串和双数据类型。我需要将这个数组传递给我的C Dll,它将数组作为对象接收。 因此,我所需要做的就是将变量数组转换成C可以理解的对象数组。有人对此有任何线索吗?这应该可以做到 ArrayList a = new ArrayList(YourObjectArrayHere); 这应该能奏效 ArrayList a = new ArrayList(YourObjectArr

我有一个VB6应用程序,它使用C编译的Dll。我通过COM成功地完成了这项工作。 但我的问题是,我有一个变量数组,其中包含字符串和双数据类型。我需要将这个数组传递给我的C Dll,它将数组作为对象接收。
因此,我所需要做的就是将变量数组转换成C可以理解的对象数组。有人对此有任何线索吗?

这应该可以做到

ArrayList a = new ArrayList(YourObjectArrayHere);

这应该能奏效

ArrayList a = new ArrayList(YourObjectArrayHere);

这必须从C的角度来做;如果不是,那么在VB6中就没有什么可以做的了。也就是说,默认情况下,方法声明如下:

void Foo(object[] a);
将从VB6中被视为采用变量数组,或者在IDL级别上,将被视为SAFEARRAYVARIANT


如果它不适合你,那么你的C声明就有问题了——请发布它们,这样它们可能会被审查。

这必须从C的角度来做;如果不是,那么在VB6中就没有什么可以做的了。也就是说,默认情况下,方法声明如下:

void Foo(object[] a);
将从VB6中被视为采用变量数组,或者在IDL级别上,将被视为SAFEARRAYVARIANT


如果您的C声明不起作用,那么您的C声明就有问题了-请发布它们以便查看。

object[]System.Runtime.InteropServices.Marshall.GetObjectsForNativeVariant SintPtr aSrcNativeVariant,int-cVars

你试过这个方法吗

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

我自己还没有尝试过,但似乎它会起作用。

object[]System.Runtime.InteropServices.Marshal.getobjectsfornativevariantsinptr aSrcNativeVariant,int cVars

你试过这个方法吗

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

我自己还没有试过,但似乎它能奏效。

这是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是变量的数组

我认为我在C语言上做不了什么,就像你们说的,一旦我在函数调用中遇到的错误是无效的过程调用或参数。VB6端有任何选项吗


感谢所有回复。

这是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是变量的数组

我认为我在C语言上做不了什么,就像你们说的,一旦我在函数调用中遇到的错误是无效的过程调用或参数。VB6端有任何选项吗

谢谢你的回复