Perl で Win32::API プログラミング入門
ActivePerl (Windows版) には Win32::API - Perl Win32 API Import Facility - metacpan.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メッセージボックスが表示されます。
これを 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 さん
- x64版Vistaでも動きました! (Perlは5.10 x86) by kaorunさん
ありがとうございます!