从perl访问dll

时间:2011-01-28 17:51:13

标签: perl winapi

我正在尝试使用Win32::API模块访问某些win32 api函数 下面是我的代码:

代码运行但结果为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';
}

2 个答案:

答案 0 :(得分:2)

问题可能是您在主机名中有下划线,我认为这是无效的。我完全按照您发布的方式尝试了代码并收到错误The parameter is incorrect.。如果我删除了下划线(例如,testsite),则API返回true。

您可以添加以下内容以打印失败的错误消息;它将提供有关失败原因的更多信息。

print Win32::FormatMessage( Win32::GetLastError() );

答案 1 :(得分: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非常混杂灵活地将数字视为字符串,反之亦然,因此您可能将字符串值"0"传递给DLL函数(可能没有NUL字符串末尾的字符)。你可以尝试一下

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

另外,请检查$!$^E以查看Perl和Windows设置的其他错误消息。