Perl Win32 :: API () тип возвращаемого значения - PullRequest
1 голос
/ 24 февраля 2011

Может ли кто-нибудь привести пример того, как строка может быть возвращена из вызова с использованием функции Win32::API()? Мне нужно вернуть строку и напечатать, используя $val. Пожалуйста, приведите пример, если то же самое можно обработать, используя указатель в качестве возвращаемого типа.

use Win32::API;  
my $res = new Win32::API('abc.dll','MyFun','_argument type list_','_Return type list_')or die $^E;  
my $val= $res->Call();   
print ($val);

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

Документация для Win32::API Call() метода предполагает, что вы должны передать Call() скаляр, который будет использоваться в качестве буфера для хранения возвращаемого значения;Call () сам возвратит, был ли вызов успешным или нет.

Пример:

my $return_buffer = " " x 80;
if ($res->Call(80, $return_buffer)) {
    print "OK, the API call returned '$return_buffer'\n";
} else {
    print "The API call failed for some reason.\n";
}

РЕДАКТИРОВАТЬ: цитирование из документов для полноты:

Здесь необходимы два параметра: длина буфера, который будет содержать возвращенный временный путь, и указатель на сам буфер.Для числовых параметров вы можете использовать либо константное выражение, либо переменную, в то время как для указателей вы должны использовать имя переменной (без ссылок на Perl, просто имя простой переменной).Также обратите внимание, что память должна быть выделена перед вызовом функции, как в C. Например, для передачи буфера из 80 символов в GetTempPath (), она должна быть предварительно инициализирована с помощью:

$lpBuffer = " " x 80;

Это выделяетстрока из 80 символов.Если вы этого не сделаете, вы, вероятно, получите ошибки исключения Runtime, и, как правило, ничего не будет работать.Поэтому вызов должен включать:

$lpBuffer = " " x 80;
$GetTempPath->Call(80, $lpBuffer);

И результат будет сохранен в переменной $ lpBuffer.Обратите внимание, что вам не нужно передавать ссылку на переменную (например, вам не нужен \ $ lpBuffer), даже если ее значение будет установлено функцией.

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

Я не вижу очевидной проблемы с тем, как вы это делаете.Модуль Win32::API способен получать char * из функции DLL и преобразовывать его в скаляр Perl.Этот код, например, выполняет то, что я ожидаю:

use Win32::API;
$GetCommandLine = Win32::API->new('kernel32',
                                  'LPTSTR GetCommandLine()');
$val = $GetCommandLine->Call();
print "The command line of this program is: $val\n";

, который должен напечатать

The command line of this program is: C:\strawberry\perl\bin\perl.exe win32-api-string.pl

Очевидные вещи - проверка возвращаемых значений, а также $! и $^E с каждого шага вашего кода и abc.dll в вашей программе $PATH.Возможно, вы захотите удалить .dll из вызова функции (просто скажите Win32::API->new('abc', ...)) - ни один из примеров когда-либо явно не включает расширение .dll, и, возможно, модуль предполагает, что вы не используйте его (и вместо этого попытайтесь загрузить библиотеку из abc.dll.dll).

Вы также можете попробовать использовать конструктор Win32 :: API из прототипа , как у меня естьсделано в моем примере.Я обнаружил, что это дает мне меньше головной боли при правильной настройке аргумента и возвращаемых типов (но иногда больше головной боли при попытке вставить какой-то тип объекта в список типов, которые Win32::API поддерживает прямо из коробки ).(Конструктор стиля списка параметров в любом случае устарел, согласно документации v0.59).

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