TAKESAKOのはてな出張所 RSSフィード

2009-03-24

PerlWin32::API プログラミング入門

ActivePerl (Windows版) には The CPAN Search Site - search.cpan.org が付属しているので、今日からすぐに Win32::API を利用したプログラミングが出来ます。

簡単なメッセージボックスを表示するPerlプログラムは以下になります。

#!/usr/bin/perl
use Win32::API;
my $MessageBox = Win32::API->new("user32", "MessageBoxA", "NPPN", "N");
   $MessageBox->Call(0, "Hello, World!\n", "Message", 0);

このプログラム実行すると、「Hello, World!」と書かれたWindowsメッセージボックスが表示されます。

f:id:TAKESAKO:20090324162207g:image

これを Win32::API を使わない形に書き直すと以下のようになります。

#!/usr/bin/perl
use DynaLoader;
sub GetProcAddress {
	my ($DLL, $API) = @_;
	my $path = "$ENV{SystemRoot}\\system32\\$DLL";
	my $libref = DynaLoader::dl_load_file($path);
	pack "L", DynaLoader::dl_find_symbol($libref, $API);
}
my $x86 = ""
. "h\0\0\0\0"
. "h" . pack("P", "Message")
. "h" . pack("P", "Hello, World!\n")
. "h\0\0\0\0"
. "\xb8" . GetProcAddress("user32.dll", "MessageBoxA")
. "\xff\xd0" # call eax
. "\xc3"     # ret
;
DynaLoader::dl_install_xsub("X",unpack"L",pack"P",$x86);&X;

DynaLoader はとっても便利なモジュールですね。

Perl 5.10.0 / 日本語 Windows XP SP2 (x86) の環境で試しました。

(もしかしたら Vista や 64bit Windows 環境では動かないかもしれませんが、手元に環境がないので)→追記の動作報告があり、動いたみたいです。

■追記:

Twitter/ワッサーで以下の方々から動作報告をいただきました。Vistaやstrawberry perlでも動作するようです。

  • "Win32::APIを使わない方" WinXP pro, Strawberry Perl v5.10.0でも実行可能なことを確認しますた by likkさん
  • ちなむと、便利なDynaLoaderはVista上のActivePerlでもちゃんと動いてますよ。 by printf("hsegawa\n"); //DEBUG さん
  • x64Vistaでも動きました! (Perlは5.10 x86) by kaorunさん

ありがとうございます!

chaichanPaPachaichanPaPa 2009/03/25 19:53 できれば、ソースの解説を希望します。
Win32::APIは、引数のところ。
DynaLoaderは、ほぼすべて。

TAKESAKOTAKESAKO 2009/03/27 18:49 > chaichanPaPaさん
コメントありがとうございます。詳細は Shibuya.pm#11 で解説する予定です。
http://shibuya.pm.org/blosxom/techtalks/200904.html

chaichanPaPachaichanPaPa 2009/04/21 23:47 >TAKESAKOさん
申し込んで、楽しみにしていたのですが、仕事の都合で明日はいけなくなりました。
次回を楽しみにしています。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。