Bintuch has asked for the wisdom of the Perl Monks concerning the following question:

Kind monks,

I'm trying to interface some sort of Card Reader which I have COM object for. However, I can't get the value of the output parameters, but only the returned value of the function.

The 'Is_In' is output (not returned) parameter which suppose to detect the presence/absence of a card in the device.

I've checked COM object with VBScript and it's Ok. My code:
use Win32; use Win32::OLE; use Win32::OLE::Variant; ## Creating the 'Rdr' object - Ok my $Status; my $Is_In; $Is_In = 0; while (1) { $Status = $Rdr->IsCardIn($Is_In); print "Is Card In:$Status ; IsCardIn:$Is_In\n"; sleep(1); }

The $Is_In variable is never updated.

Can you please help?

Replies are listed 'Best First'.
Re: COM Object
by Jenda (Abbot) on May 11, 2010 at 14:55 UTC

    I believe you have to predeclare the variable as VT_BYREF first. Something like:

    my $Status; my $Is_In = Variant(VT_BYREF | VT_VARIANT, 0); while (1) { $Status = $Rdr->IsCardIn($Is_In); print "Is Card In:$Status ; IsCardIn:$Is_In\n"; sleep(1); }

    Look at the "Variants by reference" section of the Win32::OLE::Variant docs.

    Jenda
    Enoch was right!
    Enjoy the last years of Rome.

      It Works!! Many Thanks
Re: COM Object
by bingos (Vicar) on May 11, 2010 at 10:28 UTC

    Is this COM object documented somewhere?

    The only thing I can think of with the scant information provided is that perhaps you need to provide a scalar ref to the IsCardIn method

    $Status = $Rdr->IsCardIn(\$Is_In);

      I've already tried this one.. No luck.. I have the usage for VBScript:

      Dim is_in is_in=0 Do While is_in<>1 status=RDR.IsCardIn(is_in) CheckStatus status,"IsCardIn" Loop

      COM Object Function:

      [id(0x0000000b), helpstring("method IsCardIn")] HRESULT IsCardIn( [out] VARIANT* is_in, [out, retval] VARIANT* status);