Ruby win32ole 拡張モジュール覚え書き(1)

win32ole拡張モジュールは Windows の OLE オートメーションサーバーを 利用できるように Rubyを拡張するモジュールです.
Win32OLE 製作過程の目次へ

動機

私が,win32ole 拡張モジュールを作ろうと思ったきっかけは・・・.

あるとき, Perlというプログラム言語を使っている 人に Rubyというプログラム言語があるよと 私は紹介しました. するとその人は私に1つの質問をしたのでした.

「Ruby には,Perlみたいな OLE 拡張モジュールがあるの?」

OLE 拡張モジュールが,Ruby にあるのかどうか知らなかった私は, メーリングリストで質問してみました. が,誰からも何の回答もありませんでした. どうやら OLE 拡張モジュールは存在しないようだと判断した私は 「しょうがないなあ.自分で作るか.」 と一瞬考えましたが, 「OLEの知識も無いし,面倒そうだから止めよう. そのうち誰かがきっと作ってくれるだろう.」 と賢明にも考えなおし, その人に

「今のところ,無いみたいだよ.」
と返事したのでした. (こうして私は,Ruby ユーザーを一人増やすことに失敗したのでした.)

それからしばらくして,MLに質問が流れました.

「Ruby から Excelをコントロールすることはできますか? そういう機能が無ければ作ろうと思うんですけど, 作るのは大変でしょうか?」
私は
「私も以前同じような質問(OLE拡張モジュールがあるか?)をしましたが 誰からも返事がありませんでした.多分無いと思います. Perlでは,できるみたいです.」
と回答しました. 私は きっと質問した人が作ってくれるんだろうな と考えて
「私も作ろうかと思いつつ何もやってません.」
とさらに一言付け加えました. (自分では,win32ole拡張モジュールの使い道を思いついていなかったので, 作る手伝いぐらいならできるかなという軽い気持ちだったのでした.) 世の中思い通りにはいきません.相手からの返事は
「じゃあ,お願いします.」
というものでした.さらに追い討ちをかけるように別の人から
「応援してるから,頑張って.」
と言われたのでした. OLEを全く知らない私が 見事に墓穴を掘り
「では,OLEの勉強もかねてやってみましょう.」
ということになり,私自身はあまり必要としていない win32ole拡張モジュール を作成することになったのでした. (OLEを知らない私は, 拡張モジュールができなくても,OLEの勉強ができればそれで良い と考えていました. 私が勉強している間に誰かがきっと作ってくれるだろうとも 考えていました.)

目標設定

OLEを知らない私は,win32ole拡張モジュールにはどんな機能が 必要なのか, また,その機能を実現するのが易しいのか難しいのかも わかっていませんでした. そこで, win32ole 拡張モジュールは, 必要最小限の機能だけを実装する という方針にしました. これは と考えたからです.

Perl for Win32には,OLEを使ったサンプルの スクリプト,excel1.pl,excel2.plが添付されています.

「excel1.pl,excel2.plと同等のスクリプトを,Rubyで作ることができるか」

ということを「必要最小限」の機能を実装できたかどうかの 判断基準に設定しました. (私は,win32ole拡張モジュールの実用的な使い道を思い付いて いなかったのです.) スクリプトを作成できれば,必要最小限の機能を実装している, 作成できなければ,機能が不足しているという訳です.


準備段階

OLEのことも拡張モジュールの作り方も知らない私は,拡張モジュールを 作成するのに必要な資料を集めました.

基本方針

方針1.必要最小限の機能だけを実装する

excel1.pl,excel2.plと同等のスクリプトを,Ruby で 実現するための機能を用意するというのが最初の目標です. それ以上でもそれ以下でもありません.

方針2.Perlのソースコードを参考にする

Python の COM拡張モジュールは,COM 全般を扱っていて, 巨大なモジュールなので,私の手には負えないと判断しました. 一方 Perl の OLE 拡張モジュールは, OLEオートメーションクライアントの機能を中心に実装してあり, 比較的コンパクトなので,こちらを参考にすることにしました. (実は,Rubyの win32ole 拡張モジュールは, 私の能力の関係上,Perl の OLE拡張モジュールより かなり機能を削っているので更にコンパクトです. ・・・機能が不足しているという表現もできます.)

方針3.開発にはC言語を使う

Rubyの拡張モジュールは,C++ でも書けないことはないらしいのですが,

  • C++ を使った拡張モジュールの場合, コンパイル時に若干の手作業が必要.(1999年3月現在)
  • 参考にできる Ruby の C++ の拡張モジュールが存在しない. (1999年3月現在)
  • OLEは,C++ を使った方が圧倒的に簡単だし, C++ を使ったサンプルコードが 多いが C でも実装できるようになっている.
  • Perl の OLE 拡張モジュールは C をベースにして作成されている. (クラスライブラリ等を使用していない.)

といった理由によりC言語を使用することにしました.

方針4.できるだけ Ruby の内部の実装に依存しないコードにする

Ruby 本体も私が面倒見ている (私には到底面倒を見れませんが) のならどうにでもなりますが,そうではないので, Ruby 本体がどう修正されるかは私にはわかりません. Ruby 本体が修正されるたびに 拡張モジュールも修正する必要があるのでは大変です. ですから,できるだけ Ruby の内部の実装に依存しないコードを 書くことにしました. ・・・何よりも保守性優先ということです.


Win32OLE 製作過程の目次へ