Как передать указатели на DLL с помощью Win32 API:?

голоса
2

Я пытаюсь переходящая в 3-х указателей на функции DLL. У меня есть:

{

$ Код = 1;
$ Len = 100;
$ Ул =» х $ Len;

$ Функция = новый Win32 :: API (DllName, 'dllfunction', 'ППС', 'V');

$ Функции-> Вызов ($ код, $, ул $ LEN);

}

DLL определяется как void dllfunction(int* a, char* str, int* len);DLL будет изменять все переменные заостренные тремя указателями.

Тем не менее, я segfaulting , когда я запускаю это. Документация для Win32 :: API указано , что я должен использовать фактическое имя переменной вместо переменной ссылки на Perl. Может кто - нибудь сказать мне , что мне не хватает? Благодарю.

*больше информации:

Я добавил printf()в DLL , чтобы распечатать адреса трех указателей, и printfв Perl , чтобы распечатать ссылку из трех переменных. И я получаю следующее

DLL: Код = 0x10107458 Ошибка = 0x10046b50 ул = 0x10107460

Perl: Код = 0x101311b8 Ошибка = 0x101312a8 ул = 0x10131230

Любая идея, почему DLL получает неправильные адреса?

****Больше информации

После долгих отладки, я узнал, что это происходит при возврате из функции DLL. Я добавил Е ( «сделано \ п»); как самая последняя строка этой функции DLL, и это делает вывод, то программа возвращает ошибку сегментации. Я предполагаю, что его происходит в Win32 :: API? Кто-нибудь сталкивался с этим?

Кроме того, я могу получить доступ к исходным переменным всех трех переменных из DLL. Таким образом, указатель передается правильно, но по каким-то причинам это вызывает Segfault при возвращении из DLL. Может быть, это segfaulting при попытке скопировать новые данные в переменную Perl?

Задан 09/12/2008 в 21:06
источник пользователем
На других языках...                            


4 ответов

голоса
3

AH !! Я понял.

Проблема была в этом

  1. И необязательно можно указать соглашение о вызовах, это по умолчанию «__stdcall», в качестве альтернативы вы можете указать «_cdecl».

Функция DLL была экспортирована с экстерном «C» __declspec (dllexport), так что я подумал, может быть, я должен использовать флаг «_cdecl».

Win32 :: API ( 'DLL', 'dllfunction', 'РРР', 'V', '_ Cdecl');

работает!

всем спасибо.

Ответил 09/12/2008 в 23:30
источник пользователем

голоса
0

Я не программист, но окна посмотреть:

для указателей вы должны использовать имя переменной

мне означает имена переменных, а не сами переменные. Это работает?

$function->Call('code', 'str', 'len');

или, может быть

$function->Call('$code', '$str', '$len');

Кстати, я бы не ожидал адреса памяти , чтобы быть таким же. Win32::APIнеобходимо преобразовать элементы данных Perl в то , что Windows , можно понять , и я серьезно сомневаюсь , что они будут занимать то же физическое пространство памяти.

Ответил 09/12/2008 в 23:08
источник пользователем

голоса
0

Хорошо, я последовал за ссылку Адама на этой странице . В соответствии с этим, вызов должен быть:

$function->Call(code, $str, len)

Пример кода использует функцию с LPSTR (по существу, символ *) параметром, и он использует переменный как можно было ожидать, но это немного здесь:

для указателей вы должны использовать имя переменного (нет Perl ссылки, просто обычное имя переменного).

кажется, указывает , что код я перечислил в этой должности должен работать.

Ответил 09/12/2008 в 22:09
источник пользователем

голоса
0

IANAPH, но я думаю , что вам нужно сделать , использовать ссылку , например , так:

$function->Call(\$code, \$str, \$len)

Один я не менее уверен , что это $ ул - это , возможно , не нужна ссылка. Выдаёт ошибку сегментации почти наверняка приходит из DLL пытается записать адрес памяти 1 (или 100, в зависимости от которого он пытается написать первый).

Ответил 09/12/2008 в 21:31
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more