Perl Win32 :: API () вызов () - PullRequest
       3

Perl Win32 :: API () вызов ()

0 голосов
/ 23 февраля 2011

Дорогие все, я пытаюсь получить значение указателя на символ или строку в возвращаемой функции call () для моей библиотеки DLL.моя DLL имеет функцию RandomDec (long, int *) и возвращает строку.так что будет мой вызов с использованием Win32 :: API ().Я пробовал это и не удалось.Пожалуйста, помогите

use Win32::API;  
my @lpBuffer = " " x 20;   
my $pp= \@lpBuffer;  
my $xy=0;  
my $ff= \$xy;  
my $fun2 = new Win32::API('my.dll','RandomDec','NP','**P**')or die $^E;  
$pp = $fun2->Call(4,$ff);  

как использовать $ pp?

1 Ответ

0 голосов
/ 27 февраля 2011

В вашем коде несколько ошибок.

  1. my @lpBuffer = " " x 20; my $pp= \@lpBuffer;

=> my $pp = " " x 20;

Вы смешиваете массивы со строками, и вам не нужен perl ref для c ptr. Похоже на int *.

  1. 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...