目次
PerlもWindowsならGUIがよい
そんな感じでWin32::GUIを使ってGUIプログラムを作ってみたいと思ってました。
さらに、PerlのインストールされていないWindowsでも使用できるように、exeファイルにもしたいな、とも思っていたので、これを合わせて、PerlのGUIプログラムでplファイルをexeファイルに変換できるものを作成してみよう!ということになりました。
実際に作成したプログラム、Perl-pl2exe
Perl環境設定
Windows版のPerlが必要になります
ActivePerlか、Strawberry Perlになります
このプログラムはActivePerl-5.24で作成しました。
理由は、Perl Package Managerが使いやすく、それを使いたかったからです
追加のモジュールは以下のものが必要です(依存関係で他も必要かもしれません)
MinGW
PAR
PAR-Dist
Win32-GUI
Win32-Exe
Image-Size
Encode
EXEファイルになるとはいえ、実際はZIPファイルのようで、出来上がったファイルの拡張子をexeからzipに変更して解凍すると中身がそのまま見れます。
ソースコード
使用環境によりディレクトリパスは変わります
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
#!"C:\Perl64\bin\perl.exe" use strict; use utf8; use Win32::GUI; use Win32::Exe; use Image::Size; use Cwd 'getcwd'; use File::Basename; use Encode; # 現在のディレクトリを取得 my $dir = getcwd; $dir =~ s/\//\\/g; # DOS窓を隠す my $cmd = Win32::GUI::GetPerlWindow(); Win32::GUI::Hide($cmd); # メインタイトルとサイズ my $main = Win32::GUI::Window->new( -name =>'Main', -title =>"Perl-pl2exe", -minsize => [500, 500], ); # フォントの種類とサイズ指定 my $font1 = Win32::GUI::Font->new(-name => "Arial",-size => 18); my $font2 = Win32::GUI::Font->new(-name => "Arial",-size => 14); # タイトルバーのアイコンを変更 my $iconfile = "$dir\\pl2exe.ico"; my $Icon = Win32::GUI::Icon->new($iconfile); $main->SetIcon($Icon); my $label = $main->AddLabel( -name => "toplabel", -top => 15, -left => 15, -width => 450, -font => $font1, -text => encode( cp932 => "Perl 【.pl】→【exe】へ変換") ); my $w = $label->Width() + $main->Width() - $main->ScaleWidth(); my $h = $label->Height() + $main->Height() - $main->ScaleHeight(); $main->Resize($w, $h); # デスクトップウィンドウサイズ my $desk = Win32::GUI::GetDesktopWindow(); my $dw = Win32::GUI::Width($desk); my $dh = Win32::GUI::Height($desk); # ウィンドウの表示位置 my $x = ($dw - $w) / 2; my $y = ($dh - $h) / 4; $main->Move($x, $y); # plファイルを選択する my $Label1 = $main->AddLabel ( -name => "scriptfield", -top => 100, -left => 20, -width => 200, -text => encode( cp932 => "Perlファイル選択 (.pl)" ), ); my $field1 = $main->AddTextfield ( -name => "scriptpath", -pos => [ 50, 120 ], -size => [ 350, 25 ], -tabstop => 1, ); # 変換後のexeファイル my $Label2 = $main->AddLabel ( -name => "exefield", -top => 180, -left => 20, -width => 450, -text => encode( cp932 => ">> 変換後のファイル (.exe)" ), ); my $field2 = $main->AddTextfield ( -name => "exepath", -pos => [ 50, 200 ], -size => [ 350, 25 ], -tabstop => 1, ); # ICONファイルの選択 my $Label3 = $main->AddLabel ( -name => "iconfield", -top => 260, -left => 20, -width => 450, -text => encode( cp932 => "ICONファイルの選択 (.ico)※サイズ32x32のみ" ), ); my $field3 = $main->AddTextfield ( -name => "iconpath", -pos => [ 50, 280 ], -size => [ 350, 25 ], -tabstop => 1, ); # 各ボタン $main->AddButton(-name => "Button1", -text => encode( cp932 => "ファイルを選ぶ"), -pos => [320, 150]); $main->AddButton(-name => "Button2", -text => encode( cp932 => "ファイルを選ぶ"), -pos => [320, 310]); $main->AddButton(-name => "Button3", -text => encode( cp932 => "EXEに変換する"), -pos => [280, 420]); $main->AddButton(-name => "Button4", -text => encode( cp932 => "閉じる"), -pos => [400, 420]); # メッセージラベル my $Label4 = $main->AddLabel( -name => "message", -top => 350, -left => 50, -width => 450, -font => $font2, -text => encode( cp932 => " ") ); $main->Show(); Win32::GUI::Dialog(); exit(0); # plファイル sub Button1_Click { my $File = Win32::GUI::GetOpenFileName( -directory => $dir, -defaultextension => "pl", -title => encode( cp932 => "ファイル選択" ), -filter => [ '*.pl' => '*.pl','All files' => '*.*'], ); $field1->Change( -text => encode( cp932 => "$File" ) ); # exeファイルはデフォルトで同じフォルダに設定 $File =~ s/\.pl/\.exe/; $field2->Change( -text => encode( cp932 => "$File" ) ); $Label4->Change( -text => encode( cp932 => "選択完了" ) ); } # ICONファイル sub Button2_Click { my $File = Win32::GUI::GetOpenFileName( -directory => $dir, -defaultextension => "ico", -title => encode( cp932 => "ファイル選択" ), -filter => [ '*.ico' => '*.ico'], ); $field3->Change( -text => encode( cp932 => "$File" ) ); } # EXE変換とICON変更 sub Button3_Click { my $plfile = $field1->Text(); my $exefile = $field2->Text(); my $iconfile = $field3->Text(); if(-f $plfile){ my($iconx, $icony) = imgsize("$iconfile"); $Label4->Change( -text => encode( cp932 => "exeへ変換中" ) ); system("pp --gui -o $exefile $plfile"); # ico ファイルは32x32のサイズでないと取り込めないのでそのチェック if(-f $iconfile && $iconx == 32 && $icony == 32){ my $exe = Win32::Exe->new("$exefile"); $exe->set_single_group_icon("$iconfile"); $exe->write; }elsif(-f $iconfile ){ Win32::MsgBox(encode( cp932 => "ICONのファイルサイズが32x32ではないので標準ICONを使用します" )); } $Label4->Change( -text => encode( cp932 => "変換完了" ) ); # 完了後のディレクトリを開く my $opendir = dirname($exefile); system("explorer $opendir"); }else{ Win32::MsgBox(encode( cp932 => "plファイルが選択されていません" )); } } # 閉じる sub Button4_Click { -1; } |