加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl win32 api 指针参数

发布时间:2020-12-15 21:07:20 所属栏目:大数据 来源:网络整理
导读:昨天心血来潮,想自己获取笔记本电池的百分比,晚上9点多开始,一直搞到12点多,基本上算是搞定了。 系统是win7,装的Active Perl。第一次调用系统的API,看了CPAN上的例子,上面有个getpid的,照样子写了个,运行正常,不过那个是不带参数的,比较简单。我

昨天心血来潮,想自己获取笔记本电池的百分比,晚上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
? ? 电池状态: 0
? 电量百分比: 65
? ? 剩余能量: 4294967295
? ? ? 总能量: 4294967295

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读