2010年5月28日 23:38

PerlでWin32::APIのSetLocalTimeを使う

Perlでシステム時計の日時を変更できないかなー、と思いついていろいろ調べてみる。
どうやらWin32APIのSetLocalTimeを使うとできるらしい。

参考)
http://msdn.microsoft.com/ja-jp/library/cc429941.aspx
http://dobon.net/vb/dotnet/system/setlocaltime.html

んじゃ、これやっぱPerlでもできるんじゃないかってことで、いろいろ試したらできたので覚え書き。

use strict;

use Win32::API;

Win32::API::Struct->typedef( 'TIMESTRUCT' => qw(
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
) ) or die "typedef struct TIMESTRUCT failed: [$!]\n";
my $ret = Win32::API->Import( 'Kernel32.dll', 'BOOL SetLocalTime( LPTIMESTRUCT time )' );
die "Import Win32API SetLocalTime failed: [$!]\n" unless $ret;

my $timeVar = Win32::API::Struct->new( 'TIMESTRUCT' );
$timeVar->{ 'wYear' } = 2009;
$timeVar->{ 'wMonth' } = 5;
$timeVar->{ 'wDay' } = 10;
$ret = SetLocalTime( $timeVar );
die "SetLocalTime failed: [$!]\n" unless $ret;

これでNTPサーバとの同期なんかもできそう。