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呢。。。不纠结了。
- perl win32 api 指针参数
- 调用Win32 API如何处理指针类型的参数(一)
- 调用Win32 API如何处理指针类型的参数(二)
- C#调用Win32 API如何处理指针类型的参数
- c#调用Win32 API如何处理指针类型的参数
- CSharp Tips:调用Win32 API如何处理指针类型的参数
- CSharp Tips:调用Win32 API如何处理指针类型的参数.doc
- CSharp Tips:调用Win32 API如何处理指针类型的参数(补)
- C# Tips:调用Win32 API如何处理指针类型的参数
- CSharp Tips:调用Win32 API如何处理指针类型的参数
- WIN32 API编程,wParam lParam参数小结
- perl指针
- WIN32 API多线程编码--参数传递(二)
- Embedding Perl under Win32
- Win32 API
- win32 api
- win32 api
- Win32 API
- MFC渐入渐出框实现方式二
- HDU2577
- 关于opera老是弹出error console的问题
- 读书笔记(一) -- Structure and interpretation of computer programs
- QWT的使用陷阱
- perl win32 api 指针参数
- msvcrtd.lib和libcmtd.lib冲突
- MSVC与CRT默认库链接冲突问题
- VC++中忽略所有默认库纯Win32 API编译及链接
- Vaadin Web应用开发教程(19):UI组件-Tree 组件
- Android ApiDemos示例解析(123):Views->ImageButton
- win32多线程编程
- Visual Studio 代码生成 运行时库的选择
- 内存耗尽怎么办?