#!/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', 'char* 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; # prints 'my potato'
####
#!/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;
##
##
perl -v
This is perl 5, version 18, subversion 4 (v5.18.4) built for MSWin32-x64-multi-thread