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