Perl Win32 :: API()返回类型

时间:2011-02-24 09:55:08

标签: perl

有人能举例说明如何使用Win32::API()函数从调用中返回字符串吗?我需要返回一个字符串并使用$val进行打印。如果可以使用指针作为返回类型处理相同的内容,请举例说明。

use Win32::API;  
my $res = new Win32::API('abc.dll','MyFun','_argument type list_','_Return type list_')or die $^E;  
my $val= $res->Call();   
print ($val);

2 个答案:

答案 0 :(得分:2)

documentation for Win32::API's Call() method表示您必须传递Call()一个标量,该标量将用作存储返回值的缓冲区; Call()本身将返回调用是否成功。

示例:

my $return_buffer = " " x 80;
if ($res->Call(80, $return_buffer)) {
    print "OK, the API call returned '$return_buffer'\n";
} else {
    print "The API call failed for some reason.\n";
}

编辑:引用the docs表示完整性:

这里需要的两个参数是保存返回的临时路径的缓冲区的长度,以及指向缓冲区本身的指针。对于数字参数,您可以使用常量表达式或变量,而对于指针,您必须使用变量名称(没有Perl引用,只是一个普通的变量名称)。另请注意,必须在调用函数之前分配内存,就像在C中一样。例如,要将80个字符的缓冲区传递给GetTempPath(),必须先将其初始化为:

$lpBuffer = " " x 80;

这将分配一个包含80个字符的字符串。如果你不这样做,你可能会得到运行时异常错误,通常什么都不会起作用。因此,呼叫应包括:

$lpBuffer = " " x 80;
$GetTempPath->Call(80, $lpBuffer);

结果将存储在$ lpBuffer变量中。请注意,您不需要传递对变量的引用(例如,您不需要\ $ lpBuffer),即使它的值将由函数设置。

答案 1 :(得分:0)

我没有看到你这样做的任何明显问题。 Win32::API模块能够从DLL函数接收char *并将其转换为Perl标量。例如,这段代码符合我的期望:

use Win32::API;
$GetCommandLine = Win32::API->new('kernel32',
                                  'LPTSTR GetCommandLine()');
$val = $GetCommandLine->Call();
print "The command line of this program is: $val\n";

即打印

The command line of this program is: C:\strawberry\perl\bin\perl.exe win32-api-string.pl

显而易见的事情是检查代码的每一步的返回值以及$!$^Eabc.dll位于程序的$PATH中。您可能希望从函数调用中删除.dll(只需说Win32::API->new('abc', ...)) - 没有任何示例明确包含.dll扩展名,也许模块假定您不会使用它(并将尝试从abc.dll.dll加载库)。

您也可以尝试使用the Win32::API constructor from a prototype,就像我在我的示例中所做的那样。我发现这给了我更少的麻烦设置正确的参数和正确的返回类型(但偶尔会有更多头痛试图将一些对象类型用于list of types that Win32::API supports out of the box)。 (无论如何,根据v0.59文档,参数列表样式构造函数现已弃用。)