Perl Win32::OLE从COM对象返回空对象

Perl Win32::OLE从COM对象返回空对象,perl,excel,com,vba,Perl,Excel,Com,Vba,我正在尝试使用Win32::OLE将Excel VBA中使用COM对象的例程移植到Perl。主要原因是,由于VBA在数组迭代中速度较慢,因此它会在一定程度上提高速度 以下代码在VBA中运行良好: Function LoadServerSignal(name As String, timeRange As FooCOMLib.timeRange) As FooCOMLib.SerieValues Dim server as object Dim signal As FooCOMLi

我正在尝试使用Win32::OLE将Excel VBA中使用COM对象的例程移植到Perl。主要原因是,由于VBA在数组迭代中速度较慢,因此它会在一定程度上提高速度

以下代码在VBA中运行良好:

Function LoadServerSignal(name As String, timeRange As FooCOMLib.timeRange) As FooCOMLib.SerieValues
    Dim server as object
    Dim signal As FooCOMLib.signal
    Dim fooData As New FooCOMLib.SerieValues

    Set server = New FooCOMLib.Recorder
    fooData.initialize (0)

    If server.SignalContents.FindSignalByName(name, signal) Then
       Set fooData = server.LoadSignal(signal, timeRange)
    End If

    Set LoadServerSignal = fooData

End Function
请求的信号名称通过名称字符串传递。服务器通过FindSignalByName对象方法查找名称并返回信号对象中的数据

我尝试使用Win32::OLE库将同样的东西移植到Perl。大多数接受或返回简单标量对象的项都可以正常工作。但是返回$signal对象的代码总是返回空的

#!perl -w
use strict;
use Win32::OLE;
use Win32::OLE::Variant;

my $server = Win32::OLE->new('FooCOMLib.Recorder');
my $signal = Win32::OLE->new('FooCOMLib.signal');
my $timeRange = Win32::OLE->new('FooCOMLib.timeRange');
my $fooData = Win32::OLE->new('FooCOMLib.SerieValues');    
my $name = "FooTran76";

$fooData->initialize(0);
$timerange->{StartTime} = 40909;   # Jan 1, 2012
$timerange->{EndTime} = 40910;     # Jan 2, 2012

$server->{SignalContents}->FindSignalByName($name,$signal) or die "Could not find $name\n";
$fooData= $server->LoadSignal($signal,$timeRange);
代码运行,不会在倒数第二行消失。但每次我看$signal对象时,它都是空的。时间范围和名称是正确的,因为我验证了它的解释是正确的

此外,我尝试使用Win32::OLE::Variant库更好地强制返回类型,如下所示:

$server->{SignalContents}->FindSignalByName($name,Variant(VT_DISPATCH|VT_BYREF,$signal)) or die "Could not find $name\n";
但这没用…不管我怎么尝试,仍然是一个空的$signal对象。有什么想法吗