[Perl] Win32GuiTest
[Perl] Win32GuiTest
Windows操作を自動化してナニするためのmoduleです。
source codeからのbuildとinstall
まずはソースコードを拾ってきます。本家CPANのWin32::guitestからが良いでしょう。Ver.1.56が取得できます@2009年7月8日現在
サイトからもわかるように、VC++のコマンドラインバッチを走らせた後、下記のscriptを実行して、Makefileを生成させます。
perl makefile.pl
ここで、デフォルトのままですと、VC++のランタイムライブラリ(MSVCRT90.dll(VS2008ExpEdition))が必要になります。Active Perlのversionを合わせておくだけで、ほかのマシンにもmoduleを配るのであれば、ここでstatic linkを選択すべきです。
で、Makefile.PLを編集するのが妥当な気がするのですが、いまいちどうやってコンパイルオプションを引き出してきているのかがわかりませんでした。直接Makefileを編集することにします。
・変更前
CCFLAGS = -nologo -GF -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPRIVLIB_LAST_IN_INC -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX OPTIMIZE = -MD -Zi -DNDEBUG -O1 LDLOADLIBS = oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib msvcrt.lib
・変更後
CCFLAGS = -nologo -GF -W3 -MT -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPRIVLIB_LAST_IN_INC -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX OPTIMIZE = -Zi -DNDEBUG -O1 LDLOADLIBS = oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib libcmt.lib
それぞれ位置はバラバラですが、シンボル名で検索すれば確実でしょう。編集が終わったら、makeします。
nmake
ちんたら文句言われますが、関数宣言してないとかそんなのですね。
実際にstatic linkされたか、dumpbinコマンドで確認しておきましょう。
>dumpbin /dependents blib\arch\auto\Win32\GuiTest\GuiTest.dll Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file blib\arch\auto\Win32\GuiTest\GuiTest.dll File Type: DLL Image has the following dependencies: perl510.dll KERNEL32.dll USER32.dll GDI32.dll Summary 3000 .data 5000 .rdata 2000 .reloc 1000 .rsrc 1000 .shared 1B000 .text
VCのdllは要求されていませんね。perlのdllを要求されていることから、少なくとも Perl 5.10以外では使えないことがわかります。Active Perlのversionを合わせておかないと、あとでppm installができません:)
次に、module testを行うわけですが、国際化対応していないのでNGになります。テストパターンは、Win32-GuiTest-1.56\tに入っています。関数電卓(calc)は、メニューやボタン名に漢字が使われるため、windowが見つからないといわれてしまいます。日本語仕様に合わせて修正しておきます。
・"02_calc.t"
# MenuSelect("&View|&Scientific"); MenuSelect("表示(&V)|関数電卓(&S)"); # ($hex) = FindWindowLike($calc, "Hex"); ($hex) = FindWindowLike($calc, "16 進"); # ($bin) = FindWindowLike($calc, "Bin"); ($bin) = FindWindowLike($calc, "2 進"); # ($oct) = FindWindowLike($calc, "Oct"); ($oct) = FindWindowLike($calc, "8 進"); # ($dec) = FindWindowLike($calc, "Dec"); ($dec) = FindWindowLike($calc, "10 進"); # PushButton("Dec"); sleep 1; PushButton("10 進"); sleep 1; # PushButton("Hex"); sleep 1; PushButton("16 進"); sleep 1; # PushButton("Oct"); sleep 1; PushButton("8 進"); sleep 1; # PushButton("Bin"); sleep 1; PushButton("2 進"); sleep 1;
・"05_which.t"
# like(WhichExe("progman"), qr/progman/i, "progman");
Vista x64環境のせいか、これはスキップされます。
以上でテストはパスされるでしょう。それではインストールしてしまいましょう。
nmake install
配布用パッケージの作成
コマンドラインのzip/tarコマンドなどが必要になります。ない場合は、配布用ディレクトリの作成までで止めておき、windows標準の圧縮フォルダでzipファイルを作るという方法もあります。
nmake ppd nmake distdir
Win32-GuiTest-1.56というディレクトリができているので、これをzipにします。
次に、Win32-GuiTestを開いて、下記のように修正します。
<CODEBASE HREF="Win32-GuiTest-1.56.zip" />
ppdとzipとをセットで配布すればおkです。ただしActive perlのDocumentationでブラウズすることができません。htmlは入らない模様です。
使い方
build/install方法を書いてたら時間切れ…。目的を実現する前に力尽きるとは口惜しや・・・('A`
参考
- 本家CPANのWin32::guitest
- サンプルコードはあまちゃんさんの書かれている、Win32::GuiTest:Windows の GUI アプリをハックしようがお勧めです。\ここからステップアップしつつ、自分の好きなことをやっていくといいでしょう。Win32APIプログラミング経験があると理解が早いと思います。