SYONテクニカル

WindowsのGUIアプリをWinBinderを用いてPHPで開発

2005/11/14

サイオンコミュニケーションズ株式会社

1.概要

1.1.PHPとは

PHPは、様々なWebアプリケーションのための動的なWebページを作成するためのオープンソースで提供されている、サーバーサイドスクリプト言語です。PHPの構文は、CやPerlに類似しているため、他のプログラミング言語の経験がある技術者にとっては短期間での習得が可能です。
また、MySQL、PostgreSQLなどと非常に容易に接続できる、文字列操作が容易であるなどの理由により、短い時間での開発が可能であるため、弊社ではコールセンターのイントラネット内の内部ツールを作成する際や、顧客のWebサイトを構築する際に、動的なページを作成する際などの開発に頻繁に採用しています。

1.2.CLI版PHP とその問題点

PHP4.3以降、CLI(Command Line Interface)版のPHPが正式リリースされました。私自身はWeb系プログラミングの経験が一番長いのですが、今まではWindows系のアプリケーションを作成する際に、他に選択肢が無いためにVB.NETなどを使用するというケースがあったのですが、PHPのCLI版を使用することにより、Windowsアプリケーションを、慣れ親しんだPHPで開発することで、今までに比べて短期間で開発できるようになりました。
しかし、CLI版PHP単体ではGUIを作成することはできないため、Windows環境でGUIアプリを作成する際には、CLI版PHPからVB.NETを呼び出す等の方法を取らざるをえませんでした。

1.3.WinBinderとは

CLI版PHPでGUI連動型のアプリケーションを作成する方法について、調べていると、WinBinderというものを見つけました。WinBinderは、PHPでWindowsのGUIを作成するためのエクステンションです。現在、ヴァージョンはまだα版なのですが、Windows版のGUIアプリケーションを短期間で作成することができるかもしれないので、今回これを試してみることにしました。

2.マシン環境

今回、検証をおこなったマシン環境は次のとおりとなっています。
(PHPは既にインストール済とします)

CPU Pentium3 800MHz
Memory 512MB
HDD 40G
OS Windows2000 SP4
※ WindowsXPで作業を行うと、もう少し今風のGUIが表示されます。
PHP PHP 4.4.1

3.インストール

zipファイルをダウンロードして解凍します。
winbinder_0.41.157.zip (654 kB - Aug 12, 2005)
ダウンロードしたファイルを適当な場所に展開します。(ここではC:\winbinderとします)

3.1.動作確認

コマンドプロンプトを開き、動作確認を行います。

C:> cd C:winBinderCodeSamples
C:winbinderCodeSamples>C:winbinderphpphp4php-win welcome.phpw

以下のような画面が表示されれば、インストール成功です。

  
図1:welcome.phpw起動画面

Samplesディレクトリ内の拡張子phpwのファイルは、welcome.phpwと同様に起動する事が可能ですので、他サンプルもいろいろ見てみると、WinbinderでどんなGUIが作成できるか参考になると思います。

4.試してみたいこと

3.1の動作確認でWinBinderが動作することは確認できました。となると、私としては実際にある程度業務で使える可能性があるかどうかが気になります。そのため、以下の2点の検証を行うことにしました。

  1 日本語が問題なく表示できるか
やはり、日本語の表示に問題があるかどうかは重要な問題です。

  2 PHP CLI版プログラムとの連携ができるか

    WinBinderでGUI周りを、内部処理をPHP CLI版で作りたい。これが可能かどうか?

5.日本語が表示できるか

WinBinderには、まだ正式な解説書等はない(と思われる)ので、サンプルを参考にしながら検証を行っていきます。
C:\winbinder\Code\Samples 内にhello.phpwというファイルがありました。このファイルを元に、以下のようなソースを生成してみました。

<hello_jp.phpw のソース>

<?php
// 初期設定
include "../inc/winbinder.php";
define("APPNAME",           "日本語テスト");
define("PATH_RES",          "../res/");
define("ID_ABOUT",          101);

// メインウィンドウの設定
$mainwin = wb_create_window(NULL, AppWindow, APPNAME, 320, 240);
wb_set_handler($mainwin, "process_main");
wb_set_image($mainwin, PATH_RES . "hyper.ico");

// メニューの設定
wb_create_control($mainwin, Menu, array(
"&ファイル", array(IDCLOSE,  "&閉じるtAlt+F4", NULL, PATH_RES . "menu_exit.bmp"),
"&ヘルプ", array(ID_ABOUT, "&本アプリについて...", NULL, PATH_RES . "menu_help.bmp")));

// ステータスバーの設定
$statusbar = wb_create_control($mainwin, StatusBar, APPNAME);

// ラベル
$str = "日本語がn".
       "表示できるかどうかn".
       "重要な問題です!";
wb_create_control($mainwin, Label, $str, 10, 70, 290, 80, 0, WBC_CENTER);

// アプリケーションループ
wb_main_loop();

// メインウィンドウ制御用関数
function process_main($window, $id)
{
    global $statusbar;

    switch($id) {

        case ID_ABOUT:
            wb_message_box($window, "WinBinder version " . WBC_VERSION .
              "nPHP version " . PHP_VERSION .  "n" .
              wb_get_system_info("osversion"), "About " . APPNAME, WBC_INFO);
            break;

        case IDCLOSE:       // IDCLOSE is predefined
            wb_destroy_window($window);
            break;
    }
}
?>

ファイル作成後に、コマンドプロンプトより以下を実行します。

C:winbinderCodeSamples>C:winbinderphpphp4php-win hello_jp.phpw

すると、以下のような画面が表示されました。

  

  図2:hello_jp.phpw起動画面

どうやら、ウィンドウタイトル、メニュー、ラベル、ステータスバーに日本語の表示は可能なようです。

6.PHP CLI版プログラムとの連携ができるか

検証してみたいのは、以下のような処理の流れです。

  1 「ボタンを押す」アクションがおきたら、PHP CLI版プログラム側にデータを引き渡す。

  2 PHP CLI版側で何らかの処理を行い、返り値を返却する。
3 WinBinder側で返却された値を画面表示する。

C:\winbinder\Code\Samples 内の以下のサンプルファイルを参考にしました。

  window_tutorial.phpw:ボタンの表示
editbox.phpw    :複数行のテキストを表示するボックスの作成
calendar.phpw    :表示ボックスの再描画(値が戻ってきた後に再描画する)

これらを元にして、以下のプログラムを作成しました。

<call_phpCLI.phpw のソース>

<?php
include "../inc/winbinder.php";
include "./readTextFile.php";

$mainwin = wb_create_window(NULL, AppWindow, "連携テスト", 320, 240);
wb_create_control($mainwin, PushButton, "ファイル読込み", 10, 10, 80, 20, 101);

$str = "";
$edit = wb_create_control($mainwin, EditBox, $str,
10, 35, 160, 80, 102, WBC_MULTILINE);

wb_set_handler($mainwin, "process_main");
wb_main_loop();

function process_main($window, $id) {

    global $edit;

    switch($id) {

        case 101:
            $str = readTextFile("test.txt");    // PHP CLI版のファイルをコール
            wb_set_text($edit, $str);           // 再描画(テキストエリア)
            break;

        case IDCLOSE:
            wb_destroy_window($window);
            break;
     }
}

?>

また、PHP CLI版側のプログラムとして、以下のファイルを用意しました。
readTextFile.php  :引数として渡されたtextファイルを読み込み、その中身を返却。

<readTextFile.phpのソース>

<?php
function readTextFile($fpath) {

	$str = "";
	$lines = file($fpath);
	foreach ($lines as $line_num => $line) {
    	$str .= $line;
	}
	return $str;

}
?>

なお、読み込みたいファイルの中身は以下のようになってます。
<test.txtのソース>

これは
テスト
ファイルです。

コマンドプロンプトより 以下を実行します。

C:winbinderCodeSamples>C:winbinderphpphp4php-win call_PHPCLI.phpw

  

  図3:call_PHPCLI.phpw 起動画面

  
図4:call_PHPCLI.phpw 「ファイル読込み」ボタンを押した後の画面

PHP CLI版プログラムの処理結果(test.txtの内容を読み込む)が画面に表示されているようです。
データベース操作なども、おそらく同様の仕組みで実現可能なのではないでしょうか。

7.最後に

WinBinder関連の情報が少ない点は難点なのですが、サンプルソースが基本的には読みやすいものが多いので、それを見ながらでもけっこういろいろできそうだと感じました。2005/11/14現在の最新版がVersion 0.42 (alpha) ですので、正式版のリリースが待ち遠しいところです。

Copyright 1999-2012 SYON Communications, Co. All rights reserved