2011-01-28 3 views
0

Я пытаюсь получить доступ к некоторой функции Win32 API с помощью Win32::API модуля ниже мой код:доступ к DLL из Perl

код выполняется, но результат 0 (без успеха). может кто-нибудь посоветовать, если есть проблема с приведенным ниже кодом или если есть проблема переноса значений с perl-стороны на сторону c.

my $site = 'http://www.test_site.cn/\0'; 
my $key =0; #NULL 
my $value ='data=testdata; expires = Thu, 15-Nov-2010 15:08:00 GMT\0'; 

my $InternetSetCookie = Win32::API->new('Wininet.dll', 'BOOL InternetSetCookie(
    LPCTSTR lpszUrl, 
    LPCTSTR lpszCookieName, 
    LPCTSTR lpszCookieData)' 
); 

my $res = $InternetSetCookie->Call($site,$key,$value); 

if ($res) { 
    print 'success'; 
} 
+1

Вы пытались вызвать GetLastError, чтобы узнать, что представляет собой код ошибки? – cdhowie

+0

Если вы используете Win32? Разве Win64 не новый стандарт? – vol7ron

+0

@ vol7ron: 64-разрядные версии Windows реализуют API Win32. Или вы думаете, что есть модуль Perl с именем 'Win64'? –

ответ

1

Две вещи выскочить на меня:

Один из них, вы используете одинарные кавычки с последовательностью символов \0 в них, что, вероятно, не то, что вы хотите. Использование строк в двойных кавычках, чтобы интерполировать эту последовательность в NUL характер, или добавить его отдельно:

my $site = "http://www.test_site.cn/\0"; 
my $value ='data=testdata; expires = Thu, 15-Nov-2010 15:08:00 GMT' . chr(0); 

Во-вторых, вы установили $key к 0, но ваш комментарий указывает на то, что вы думаете, это установить его в NULL. Perl очень promiscuous гибко относится к обработке чисел как строк и наоборот, поэтому вы, вероятно, передаете строковое значение "0" функции DLL (и, возможно, без символа NUL в конце строки). Вы можете попробовать один из

my $key = ''; 
my $key = "\0"; 

Кроме того, проверьте $! и $^E для других сообщений об ошибках, установленных Perl и Windows.

2

Проблема может заключаться в том, что у вас есть символ подчеркивания в имени хоста, который, как я считаю, недействителен. Я пробовал код точно так же, как вы разместили, и получил ошибку The parameter is incorrect.. Если я удалил символ подчеркивания (например, testsite), тогда API вернул значение true.

Возможно, вы добавили следующее, чтобы распечатать сообщение об ошибке при сбоях; он даст немного больше информации о причине сбоя.

print Win32::FormatMessage(Win32::GetLastError()); 
Смежные вопросы