ActiveXコントロール(OLEコントロール)の作り方 VBやPBからCの関数を呼び出すのに、DLLを使う方法は作りやすいのですが、 使うほうは毎回宣言を書いたり呼び出したりしなければならず、 また型が合っているかなどのチェックは全部自分でやらなければいけません。 また、複雑で、相互に関連のある関数群を使うようになると、 「この関数を呼ぶ前にはこの関数を呼んでおかないといけない」 など依存関係もからんできてますますタイヘンになります。 せっかくRADツールを使っているのに、 これらを全部人間が把握しておかないといけないなんて、ほんとにダサダサだぁ! というわけで、こういう場合にはActiveXコントロール(OLEコントロール) を作るとベンリです。 ちなみに、 Visual Basic 2.0の時代に 「VBX」と呼ばれていた再利用可能なコンポーネントが、 統合オフィスツールの「リンクはりつけ」を実現するOLE 2.0の登場に合わせて 「OLEコントロール」(*1)へと発展し、 さらにサンの言語処理系Javaの登場にマイクロソフトが驚いて、 急遽このOLEコントロールを焼きなおしたのが 「ActiveXコントロール」 というわけで、OLEコントロールとActiveXコントロールは基本的には同じものです。 (*1)拡張子が「.ocx」のため、「OCX」とも呼ばれます。ただし、ActiveXコントロールを作るのは、DLLを作るよりいろいろタイヘンです。 ActiveXコントロールはテキストエディタ直書きで書くのが非常に面倒なため、 普通はVisual C++を使って(コードの大半を機械生成させて)作るのですが、 中間ファイルの扱いなどが複雑で、 一度定義した内容を変更するとコードが無茶苦茶になってしまう可能性があります。 従って、ActiveXコントロールをVisual C++で作るときには、 最初にプロパティ、メソッドの定義をきっちり決めておいて、 途中で変更しない、というのがポイントです。 ここでは、Visual C++ 4.0の統合開発環境で作る方法をメモっています。 ここで作るサンプルは、「目には見えないコントロール」 (見えても意味がないコントロール)として、
コントロールを作る
● ワークスペースを作る
|
|
● ウィザードに応答
● コードの記述
|
|
コントロールを作るときには、 決まった形でセットになった宣言や定義を書く必要があるので、 コントロールのプロパティやメソッドをコード直書きでがりがり書いていくと、 ソースコードの構造を破壊してしまうことがあります。 これは下のクラスウィザードを使うようにします。
● クラスウィザード
● クラスウィザードでメソッドを追加
|
|
このように、メソッド名「add2」、引数としてlong型の変数aと変数bを取り、 long型の値を返すメソッドですよ、という宣言をしています。 外部名と内部名は普通同じでOKです。 コントロールでは、引数に文字列(char* )が渡せないようです。 const char* ならWin32でいう LPCTSTR 型として定義できますが、 constでないchar*を渡すことができない?のかなあ、という。 この辺りはまだ勉強不足なので、ご存知の方がおられましたら教えてくださいね。
● クラスウィザードでプロパティを追加 |
|
「インプリメント」は、クラスのメンバ変数として定義する (プロパティ自身の値をもつメンバ変数を1つ定義する。 そのプロパティが変化したときに呼ばれるイベントハンドラ 「通知関数」が自動的に作られる)か、 または値をセットするメソッドと取得するメソッドを使う (Set{プロパティ名} というメソッドと Get{プロパティ名} というメソッドが自動的に作られる) かを選べます。どちらがどう使い勝手が違うのかよくわからないので、 簡単そうな前者を使うことにします。
● クラスウィザード完了 |
|
● 再度コードの記述 STDAPI long add2(long a, long b){ // TODO: ここに書いてチョ。 return 0; }このようなコードが自動的に生成されているので、自分で STDAPI long add2(long a, long b){ // このメソッドは、引数の和を返すというはかなくも美しい処理を // するので皆で感動しよう return a + b; }と書きます。いや、どうでもいいことは書かなくてよいです…
● ビルド
|
|
● コンテナでテストする (レジストリに登録) dos> regsvr32 /the/path/of/sampleole.ocx (レジストリから削除) dos> regsvr32 /u /the/path/of/sampleole.ocxバッチファイルから実行する場合は、ダイアログを出さないように 「/s」オプションをつけるとよいです。 レジストリには、コントロールの実体である .ocxファイルのパス情報が記録されています。 したがって、.ocxファイルの位置を移動させたい場合、 上のコマンドでまずレジストリから削除し、 それから移動させ、最後にレジストリに再登録する必要があります。
VisualBasicで使ってみよう
● コントロールを呼び出す |
|
● アイコンが出たぞ |
|
● 画面に配置
|
|
● コードを書く dim n, r as long r = ole_1.add2(1000, 2000) n = ole_1.len2("Hello, World.") MsgBox("sum=" + str(r) + " len=" + str(n))
PowerBuilderで使ってみよう
● コントロールを選択 |
|
右端のタブをつつき、「OLEカスタムコントロール」として Sampleoleコントロールを選択します。
● ウィンドウに張りつける |
|
● コードを書く long r, sum String result sum = ole_1.object.add2(1000, 2000) r = ole_1.object.itoaa2(99) result = ole_1.object.result MessageBox("実行結果", "sum=" + string(sum) + ...PBでは、このようにカスタムコントロール名のあとに「.object」 をつけ、その後にメソッド名やプロパティ名をつなげて書きます。 |
|
|