Я пытаюсь вызвать функцию Win32 API из Perl с помощью Win32 :: API и передать массив массивов. Конкретная функция - WaitForMultipleObjects
, и мне не нравится, как я ее подаю. Вот как это определено в Perl:Невозможно передать массив массивов дескрипторов Win32 :: API в Perl
# DWORD WaitForMultipleObjects(DWORD nCount, HANDLE* handles, BOOL, DWORD)
$WaitForMultipleObjects = new Win32::API::More('kernel32',
'WaitForMultipleObjects', 'NPNN', 'N');
Тогда есть массив ручек. Все они подтверждены действительными, и все они работают, когда передаются по отдельности WaitForSingleObject
. Вот как я упаковываю параметры:
my @handles;
...
my $n = scalar(@handles);
my $handlePack = pack "L*", @handles; # also tried 'L1', 'L2', etc.
$rc = $WaitForMultipleObjects->Call($n, $handlePack, 0, 0xffffffff); # fails
Это терпит неудачу, и GetLastError() сообщает об ошибке 6 (недопустимый дескриптор). Однако, если я прохожу только одну ручку, он работает:
my $handlePack = pack "L", $handles[0];
$rc = $WaitForMultipleObjects->Call(1, $handlePack, 0, 0xffffffff); # works
Очевидно Win32 :: API не может передать массив дескрипторов правильно во втором параметре, но, насколько я понимаю, в документации (https://metacpan.org/pod/Win32::API), вот как это должно быть. Или мое использование pack()
неправильно? Я на 64-битном Perl, если это имеет значение.