#!/usr/bin/perl use 5.018; use strict; use warnings; use Win32::API; use Data::Dumper; $Win32::API::DEBUG = 1; my $method = new Win32::API::More('test.dll', 'int cat(char* a, char* b)'); if( !defined $method ) { die "Can't import API [cat]: $^E\n"; } my $return = $method->Call('my ', 'potato'); print Dumper $return; # pointer address: 42952784 # works as expected: 'my potato' my $x = unpack 'p', pack 'J', $return; print Dumper $x; # works as expected: 'my potato' my $x = unpack 'p', pack 'Q', $return; print Dumper $x; # does not work as expected: undef my $x = unpack 'p', pack 'I', $return; print Dumper $x; # does not work as expected: undef my $x = unpack 'p', pack 'L', $return; print Dumper $x; # does not work as expected: undef my $x = unpack 'p', pack 'N', $return; print Dumper $x; # Update: I made a typo in my original post. # This (obviously) will not work on little-endian machines #my $x = unpack 'p', pack 'N2', $return; #print Dumper $x; # works(??): 'my potato' #my $x = unpack 'p', pack 'V2', $return; #print Dumper $x; # works(??): 'my potato' my $x = unpack 'p', pack 'IN', $return; print Dumper $x;