#!/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);