Я пытаюсь передать 3 указателя на функцию DLL. У меня есть:
{
$code=1;
$len=100;
$str=" " x $len;
$function = new Win32::API(DLLNAME,'dllfunction','PPP','V');
$function->Call($code,$str,$len);
}
DLL определяется как void dllfunction(int* a, char* str, int* len);
DLL изменяет все переменные, указанные тремя указателями.
Тем не менее, я запускаю segfaulting. В документации для Win32 :: API указано, что я должен использовать реальное имя переменной вместо ссылок на переменные Perl. Может кто-нибудь сказать мне, что мне не хватает? Спасибо.
* больше информации:
Я добавил printf()
в DLL, чтобы распечатать адрес трех указателей, и printf
в Perl, чтобы распечатать ссылку на три переменные. И я получаю следующее
DLL: код = 0x10107458 Ошибка = 0x10046b50 str = 0x10107460
Perl: код = 0x101311b8 Ошибка = 0x101312a8 str = 0x10131230
Есть идеи, почему DLL получает неправильные адреса?
**** Дополнительная информация
После большой отладки я обнаружил, что это происходит при возврате из функции DLL. Я добавил printf ("done \ n"); в качестве самой последней строки этой функции DLL, и это действительно выводит, то программа segfaults. Я предполагаю, что это происходит в Win32 :: API? Кто-нибудь испытывал это?
Кроме того, я могу получить доступ к начальным переменным всех трех переменных из DLL. Таким образом, указатель передается правильно, но по какой-то причине он вызывает ошибку при возврате из DLL. Может быть, это ошибка при попытке скопировать новые данные в переменную Perl?