В вашем коде несколько ошибок.
-
my @lpBuffer = " " x 20; my $pp= \@lpBuffer;
=> my $pp = " " x 20;
Вы смешиваете массивы со строками, и вам не нужен perl ref для c ptr.
Похоже на int *.
- N для номера не длинный. L будет без знака, вам нужно подписать, поэтому l.
use Win32::API;
my $pp = " " x 20; # alloc a string
my $xy = 0; # alloc an int
my $fun2 = new Win32::API('my.dll','RandomDec','lP','P') or die $^E;
$pp = $fun2->Call(4,$xy);
Я не проверял, может ли Win32 :: API выполнять lvalue-присваивание char *. Обычно нет, поэтому $ pp будет внешним указателем на некоторую строку после вызова и пред. PV слот за $ pp будет утерян и недоступен для Perl.
С FFI и WinAPI вы обычно возвращаете int, а не строки.
Строки только через побочные эффекты, как функция arg.