Perl-процедура Win32::API не найдена

Я пытаюсь использовать dll Win32 из моего кода perl.

use Win32::API;
$Win32::API::DEBUG = 1;
$function = Win32::API->new(
  'mydll.dll', 'int myfunc()',
);
$return = $function->Call();

Но я получаю следующую ошибку:

Win32::API::new: Loading library 'mydll.dll'
(PM)parse_prototype: got PROC 'myfunc'
(PM)parse_prototype: got PARAMS ''
parse_prototype: IN=[  ]
parse_prototype: OUT='int' PACKING='i' API_TYPE=3
FAILED GetProcAddress for Proc 'myfunc': The specified procedure could not be found.
Can't call method "Call" on an undefined value at .\test_dll.pl line 6.

Моя dll скомпилирована с соглашением о вызовах _cdecl. Имеет ли это какое-то значение? Я использую активный Perl 5.14 на Windows 7.


person Kallol    schedule 03.07.2013    source источник
comment
mydll.dll не содержит функцию с именем myfunc без аргументов, возвращающую int?   -  person Jim Garrison    schedule 03.07.2013


Ответы (2)


Используете ли вы __declspec(dllexport) для экспорта функций из DLL? Если да, используйте файл .def. Поскольку __declspec(dllexport) заставит имя функции в дескрипторе экспорта DLL иметь подчеркивание впереди; Или изменить имя функции, если ваша функция C++.

В последний раз, когда я использовал Win32::API, он не поддерживает __cdecl. Вместо этого вы должны изменить его на __stdcall.

person UltimaWeapon    schedule 03.07.2013
comment
добавление __declspec(dllexport) сработало для меня. Ссылка на процедуру возвращается. Я изменил вызов, так как его _cdecl as $function = Win32::API->new( 'mydll.dll', 'myfunc', 'I', undef, '_cdecl' ); $return = $function->Call( ); Хотя скрипт падает при вызове процедуры. - person Kallol; 03.07.2013

Используйте StudPE, PE Explorer или dumpbin/exports, чтобы узнать настоящее имя функции, которую вы хотите использовать. Таким образом, вам все равно, украшено ли имя функции или нет. Вы знаете его настоящее имя.

person user2360357    schedule 13.07.2013