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

dear all,

please help in defining a BSTR data type which is return type of a c++ developed .dll's function and i have to call it using win32::API.

As BSTR is defined as combination of a 4 byte integer, a string of unicode characters (wide which is of type wchar_t) and consist of 2 null characters.

The C++ function is like this, BSTR _stdcall RandomDec(unsigned long isize,long * iReturn)

in perl i am using like this,

#!/usr/bin/perl use strict; use Win32::API; use Encode qw( decode ); sub bstr_to_str { my $bstr = $_[0]; my $len = unpack('V', unpack('P4', pack('J', $bstr))); my $raw = unpack("P$len", pack('J', $bstr+4)); return decode('UTF-16le', $raw); } Win32::API::Struct->typedef('BSTR','INT','x','WCHAR','y','CHAR','z1',' +CHAR','z2'); my $iSize=8 ; my $iReturn=\0; my $iReturn_buf = pack('l', $iReturn); Win32::API->Import('My.dll','BSTR RandomDec(LONG ,LONG *)')or die $^E; + my $rv_bstr=RandomDec($iSize,$iReturn); my $rv = bstr_to_str($rv_bstr); ## how to unpack and manage BSTR? print($rv);

Replies are listed 'Best First'.
Re: define type or struct for BSTR data type
by ikegami (Patriarch) on Mar 29, 2011 at 08:31 UTC
    What was wrong with the previously given solution?
      it is not giving the result, i think there is something lacking in unpack() and unicode decoding
      thanks a lot ... i have tried with the same code with some changes in unpack() function, and now it is running and giving correct results.
        What were those changes?
        I am having similar issues can you please post your updated code?
Re: define type or struct for BSTR data type
by vkon (Curate) on Mar 29, 2011 at 08:28 UTC
    Do I understand correctly that BSTR is just UCS2-encoded zero-terminated string?
    Can you check out your C API for this?

    If my assumption is correct, then decode your from UCS2 after a call to your function.