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

时间:2013-09-20 21:50:50

标签: perl excel-vba com vba excel

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

0 个答案:

没有答案