perl win32 api 指针参数

来源:互联网 发布:太平洋软件站官方网站 编辑:程序博客网 时间:2024/04/28 13:17

昨天心血来潮,想自己获取笔记本电池的百分比,晚上9点多开始,一直搞到12点多,基本上算是搞定了。

系统是win7,装的Active Perl。第一次调用系统的API,看了CPAN上的例子,上面有个getpid的,照样子写了个,运行正常,不过那个是不带参数的,比较简单。我要用的API是getsystempowerstat,要给它传一个指针(N年没用这东西了,只有一点点C的基础)参数,各种BYTE DWORD什么的,直接上数组,@powerStat传进去..运行...直接perl解释器崩溃...改了N次都通一样,再到网上转,看了N多贴,发现一个Win32::API::Struct->typedef 就像看到希望,参照了一下,定义了一个struct,顺便补了一下指针的课,总算有点样子了,运行,这回不崩溃了,但老提示Unknown Parameter type...仔细检查了每个单词的拼写,也没错啊,我都把函数名改成了跟CSDN上查到的那个一字不差了,还是一样的。只好再去找帖子看,终于在水木清华上看到一篇,标题:"perl 如何调用其他语言写的dll",里面给了一个打印系统时间的例子,也用了一个指针参数,拿过来运行,”2012-08-14“,太兴奋了,照着样子把自己程序运行,又是Unknown Parameter type...再倒回去看,才发现我的Win32::API::Struct->typedef 那一行是在Win32::API->Import这行后面的,恍然大悟啦,这个是要按C格式的来写,先typedef,再使用这个type,交换了一下代码顺序,运行结果:”电量百分比:100“,大功靠成。兴奋得睡不着觉啊。

好啦,上代码吧。

use Win32::API;   Win32::API::Struct->typedef( 'MYTIMESTRUCT' => qw(    WORD wYear;    WORD wMonth;    WORD wDayOfWeek;    WORD wDay;    WORD wHour;    WORD wMinute;    WORD wSecond;    WORD wMilliseconds;    ) ) || die "typedef struct TIMESTRUCT failed: [$!]\n";   Win32::API->Import( 'Kernel32.dll', 'VOID GetLocalTime( LPMYTIMESTRUCT time)' ) || die "Import Win32API GetLocalTime failed: [$!]\n";   my $timeVar = Win32::API::Struct->new( 'MYTIMESTRUCT' ); $timeVar->align(0); GetLocalTime( $timeVar );   printf "%04d-%02d-%02d\n", $timeVar->{ 'wYear' }, $timeVar->{ 'wMonth' }, $timeVar->{ 'wDay' }; 

 以下是我自己的取得电源信息的代码,现在目的只是取得电池的百分比,已经完成,所以其它的问题还未深入,算是perl调用win32 api的一个入门吧。

use Win32::API;  Win32::API::Struct->typedef('POWERSTATUS',qw(BYTE ACLineStatus; BYTE BatteryFlag;  BYTE BatteryLifePercent;  BYTE Reserved1;  DWORD BatteryLifeTime;  DWORD BatteryFullLifeTime;));Win32::API->Import('kernel32', 'int GetSystemPowerStatus(LPPOWERSTATUS powerstatus)');my $powerstatus = Win32::API::Struct->new('POWERSTATUS');$status=GetSystemPowerStatus($powerstatus); print "获取电源状态:$status\n"; print "    电源状态: $powerstatus->{'ACLineStatus'}"."\n";print "    电池状态: $powerstatus->{'BatteryFlag'}"."\n";print "  电量百分比: $powerstatus->{'BatteryLifePercent'}"."\n";print "    剩余能量: $powerstatus->{'BatteryLifeTime'}"."\n";print "      总能量: $powerstatus->{'BatteryFullLifeTime'}"."\n";

刚又去运行了一下,结果如下:

获取电源状态:1
    电源状态: 0
    电池状态: 0
  电量百分比: 65
    剩余能量: 4294967295
      总能量: 4294967295

现在电池状态怎么是0呢。。。不纠结了。