Namazu-win32-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

OLE アプリケーションを毎回起動・終了させないようにする方法



竹迫です。

Subject: [namazu-win32-users-ja] Re: oleichitaro[45678].pl
From: <baba@xxxxxxxxxxxxxxxxxxxxxx> said:
>これで OASYSやIBM DOS文書、Lotusその他ほげほげなフォーマットでも、
>OLE 経由で読み込めそうなメドは立ちましたね。まあ、Office を立ち上
>げて終るということを繰り返してるわけでメモリ食いだから、
>--checkpoint オプションを付けることに気をつければ、さらに実用度が
>上がるというところでしょうか。

そうですね。OLEフィルタの使用に関係なく、大量の文書を一度にインデック
ス作成の対象とするときは、--checkpoint オプションは必須かもしれません。

あと、馬場さんのご指摘の通り、一つの文書に対して Office を立ち上げて終る
という動作を毎回繰り返しているのは非効率的ですので、mknmz 時に一度だけ必
要なOfficeアプリケーションを立ち上げておいて、そのまま立ち上がった状態で
複数の文書のインデックスの作成を行なうという事は原理的に可能です。

ただし、それには、明示的に Officeアプリケーションの destructor を mknmz 
終了時に呼ばないと、プロセスが残ったままになりますので、ole***.pl の対応
だけでは不十分で、mknmz のソースの修正が不可欠になります。

以下に oleexcel.pl を例にとって説明します。

● Excelアプリケーションを毎回起動・終了させないようにする方法

filter()サブルーチン内の my $excel; という宣言をサブルーチンの外に出して、
undef $excel; をコメントアウトしてExcelアプリケーションを毎回終了しないよ
うにします。そして、新たに Excelアプリケーションを終了させる destructor 
サブルーチン destroy() をパッケージ内で宣言します。

sub destroy() {
 util::vprint("Excel->Quit\n");
 $excel->Quit if defined $excel;
 undef $excel;
}

この destroy()サブルーチンを mknmz 終了時に明示的に呼び出すようにします。
ActivePerl の GC の仕様なのかもしれませんが、私の環境では、明示的に
$excel->Quitメソッドを呼び出さないとプロセスが終了しませんでした。

インデックスファイルを書き出す前にExcelアプリケーションを終了させる場合、
mknmz.in の以下のような箇所で eval "oleexcel::destroy();"; を追加します。

     # This should be out of above blocks because of file handler closing.
     re_exec($flist_ptr, $docid_count, $docid_base, $start_time, 
             $total_files_size, $total_files_num,
             $file_count, $key_count) if $checkpoint;
 
+    # for destroy OLE Excel application
+    eval "oleexcel::destroy();";
+
     if (%KeyIndex) {
         $key_count = write_index();
         print _("Writing index files...");

あまりスマートな書き方ではありませんが、現在のフィルタ呼び出しの構造では
そのようなメソッドが用意されていないので、ちょっと仕方がない部分があります。
他に良い方法をご存知の方がおられましたら教えてください。

修正した oleexcel.pl と mknmz.bat を同梱したデモファイルを
以下の URL に置いておきます。

・Excelを毎回起動・終了しない OLEフィルタのデモ
 http://www.namazu.org/~takesako/pub/oledemo.lzh

Word と PowerPoint は挙動が不安定でしたので、今回は Excel のみです。
興味のある方は、お試し下さると有り難いです。

--
   広島市立大学 情報科学部 情報機械システム工学科
     竹迫 良範 <takesako@xxxxxxxxx>