1

我正在尝试使用 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对象。有任何想法吗?

4

0 回答 0