VB6 DLL
我编写了一个VB6 DLL,其中包含以下用户定义类型(UDT),仅包含原始数据类型......
Public Type MyResults
Result1 As Double
Result2 As Double
Result3 As Double
Result4 As Double
Result5 As Double
End Type
......以及以下方法......
Public Sub Method1(ByRef Results As Variant)
Dim myRes As MyResults
myRes = Results
MsgBox "MyResults.Result1: " & myRes.Result1
...
End Sub
德尔福测试工具
我还在Delphi中编写了一个测试工具并创建了一个等效的Delphi记录类型来模仿VB UDT,其定义如下......
TMyResults = packed record
Result1: Double;
Result2: Double;
Result3: Double;
Result4: Double;
Result5: Double;
end;
从Delphi中,我想在VB6 DLL中调用Method1并将此类型的变量作为参数传递,以便VB可以将其解释为等效的"类型"。到目前为止,我已经尝试了以下Delphi调用...
procedure TMyApp.CallMethod1FromVBDLL(var MyResults: TMyResults);
var
results: OleVariant;
dll: Variant;
begin
results := RecToVariant(MyResults, SizeOf(MyResults));
dll := CreateOleObject('ApplicationName.ClassName');
dll.Method1(results);
...
end;
...使用以下函数(来源:http://www.delphigroups.info/2/2c/462130.html)将记录转换为变体......
function TMyApp.RecToVariant(var AR; ARecSize: Integer): Variant;
var
p: Pointer;
begin
Result := VarArrayCreate([1, ARecSize], varByte);
p := VarArrayLock(Result);
try
Move(AR, p^, ARecSize);
finally
VarArrayUnLock(Result);
end;
end;
由于DLL的Method1中的EOleException
行Type mismatch
,因此myRes = Results
被报告回Delphi。
我准备并在Delphi中正确传递参数吗? 我应该如何在VB6中使用该参数?
非常感谢任何帮助/建议。
答案 0 :(得分:2)
问题是你的Delphi代码正在创建一个OleVariant
,它包含一个字节数组(自动化类型VT_UI1 or VT_ARRAY
),这不是VB所期望的。它期待UDT记录(自动化类型VT_RECORD
)。
MSDN有一篇文章解释了如何在Variant中传递UDT:
要传递单个UDT或UDT的安全阵列以进行后期绑定,自动化客户端必须具有将UDT的类型信息存储到VARIANT所需的信息(如果是后期绑定,则必须自行描述UDT)。 VARIANT类型VT_RECORD包装RecordInfo对象,该对象包含有关UDT的必要信息和UDT本身的指针。 RecordInfo对象实现了一个新接口IRecordInfo,用于访问信息。重要的是要知道UDT的实际存储从不归VARIANT所有; IRecordInfo指针是VARIANT唯一拥有的东西。
UDT的数据包括一个指向UDT描述的IRecordInfo指针,pRecInfo和一个指向数据的指针pvRecord。
换句话说,您需要创建一个实现IRecordInfo
接口的类并包装您的实际记录数据,然后您可以使用{{1}在OleVariant
内存储该类的实例}类型。这将为COM和VB提供必要的元数据来编组和访问您的记录数据。