Perl Win32::OLE从COM对象返回空对象
我正在尝试使用Win32::OLE将Excel VBA中使用COM对象的例程移植到Perl。主要原因是,由于VBA在数组迭代中速度较慢,因此它会在一定程度上提高速度 以下代码在VBA中运行良好: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
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对象。有什么想法吗