perl win32 api 指针参数
昨天心血来潮,想自己获取笔记本电池的百分比,晚上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-%02dn",$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 "获取电源状态:$statusn"; print " 电源状态: $powerstatus->{'ACLineStatus'}"."n"; print " 电池状态: $powerstatus->{'BatteryFlag'}"."n"; print " 电量百分比: $powerstatus->{'BatteryLifePercent'}"."n"; print " 剩余能量: $powerstatus->{'BatteryLifeTime'}"."n"; print " 总能量: $powerstatus->{'BatteryFullLifeTime'}"."n"; 刚又去运行了一下,结果如下: 获取电源状态:1 现在电池状态怎么是0呢。。。不纠结了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |