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(2つの引数の和を返す)
  • len2(引数の文字列の長さを返す)
  • itoaa2(引数の整数を<>で囲んだ文字列を返す)
という、 しょーもない(ははは)計算をする機能をもつコントロールを作ることにします。 「目に見えないコントロールってなんやねん」という方は、 VBのタイマーコントロールを想像してください。 デザイン時(開発時)には時計の絵が出ていますが、 実行時には隠れて見えなくなります。 というかタイマーの機能は元々目に見えるものではないので、それでいいわけです。 タイマー計測の代わりに、給与計算とか、 ポリゴン演算などを行う機能をもつコントロールも作れ、 VBやPBから利用できるわけですが、 ここではサンプルとして「a+b=c」というしょーもない計算しかできないコントロールを作ってVBとPBの画面に張りつけてやろう、とゆー企てです。


コントロールを作る

● ワークスペースを作る
まず、Visual C++のメニューから 「ファイル」→「新規作成…」→「プロジェクトワークスペース」 で、作成するタイプに「OLE Control Wizard」を選びます。 ここでは「sampleole」というワークスペースをディスク上の好きな場所に作ります。

 

 

● ウィザードに応答
OLEコントロールウィザードの画面になります。 いくつか選択ダイアログが出てくるので、適当に選んで進んで行きます。 ここで、「実行時に不可視」を選ぶこともできますが、 最初は目に見える(図形が描かれますが、まったく無意味)コントロールにします。 また、クラス名(=コントロール名)は、「Sampleole」としましょう。 デフォルトでコントロールの記述名は「Sampleole Control」となります。

● コードの記述
ウィザードの選択が終わると、いよいよコードの記述になりますが、 かなりのコードが最初から生成されているのが確認できます。

 

 

コントロールを作るときには、 決まった形でセットになった宣言や定義を書く必要があるので、 コントロールのプロパティやメソッドをコード直書きでがりがり書いていくと、 ソースコードの構造を破壊してしまうことがあります。 これは下のクラスウィザードを使うようにします。

● クラスウィザード
メニュー「表示」→「ClassWizard…」 で、クラスウィザードを出します。 ここでSampleoleコントロールのインターフェースとなるメソッドやプロパティの定義ができます。

● クラスウィザードでメソッドを追加
メソッドとは、VBのウィンドウコントロールが「show」 メソッドを持っているのと同様、コントロールが何かの処理をする命令で、 C言語でいういわゆる関数として定義します。 「OLEオートメーション」タブの 「メソッドの追加…」ボタンを押して、メソッドを追加します。

 

 

 このように、メソッド名「add2」、引数としてlong型の変数aと変数bを取り、 long型の値を返すメソッドですよ、という宣言をしています。 外部名と内部名は普通同じでOKです。

 コントロールでは、引数に文字列(char* )が渡せないようです。 const char* ならWin32でいう LPCTSTR 型として定義できますが、 constでないchar*を渡すことができない?のかなあ、という。 この辺りはまだ勉強不足なので、ご存知の方がおられましたら教えてくださいね。

● クラスウィザードでプロパティを追加
 プロパティも、VBやPBでおなじみでしょう。ウィンドウには 「width」や「height」や「caption」などのプロパティがありますし、 コマンドボタンには「text」や「font」などのプロパティがありますし。 そういうようなのと同列に、コントロールが内部的に持っている情報として独自のプロパティを定義することができます。
 「OLEオートメーション」タブの 「プロパティの追加…」ボタンを押して、プロパティを追加します。

 

 

「インプリメント」は、クラスのメンバ変数として定義する (プロパティ自身の値をもつメンバ変数を1つ定義する。 そのプロパティが変化したときに呼ばれるイベントハンドラ 「通知関数」が自動的に作られる)か、 または値をセットするメソッドと取得するメソッドを使う (Set{プロパティ名} というメソッドと Get{プロパティ名} というメソッドが自動的に作られる) かを選べます。どちらがどう使い勝手が違うのかよくわからないので、 簡単そうな前者を使うことにします。

● クラスウィザード完了
これでSampleoleコントロールのインターフェースが定義できました。

 

 

● 再度コードの記述
 さて、今度はクラスウィザードで作ったメソッドの中身を書かないといけません。 クラスウィザードで作った直後は、

STDAPI long add2(long a, long b){
  // TODO: ここに書いてチョ。
  return 0;
}
このようなコードが自動的に生成されているので、自分で
STDAPI long add2(long a, long b){
  // このメソッドは、引数の和を返すというはかなくも美しい処理を
  // するので皆で感動しよう
  return a + b;
}
と書きます。いや、どうでもいいことは書かなくてよいです…

● ビルド
メニュー「ビルド」→「ビルド」でビルドします。 ビルドが成功したら、「sampleole.ocx」というコントロールが作られます。 このコントロールがレジストリに自動的に登録されます。

 

 

● コンテナでテストする
 メニュー「ツール」→「OLEコントロールのテストコンテナ」 で、コントロールの動作(メソッドやプロパティが正しく機能するか) を調べることができます。 ダイアログが出てくるので、引数を自由に設定してメソッドをコールすると、 実際の和や文字列の長さがちゃんと返ってくるか確認できます。
 ちなみに、コントロールをレジストリに追加したり、 削除したりするのは、下のコマンドをDOSプロンプトから実行しても行えます。

(レジストリに登録)
dos> regsvr32 /the/path/of/sampleole.ocx
(レジストリから削除)
dos> regsvr32 /u /the/path/of/sampleole.ocx
バッチファイルから実行する場合は、ダイアログを出さないように 「/s」オプションをつけるとよいです。
 レジストリには、コントロールの実体である .ocxファイルのパス情報が記録されています。 したがって、.ocxファイルの位置を移動させたい場合、 上のコマンドでまずレジストリから削除し、 それから移動させ、最後にレジストリに再登録する必要があります。


VisualBasicで使ってみよう

● コントロールを呼び出す
 まず、ツールボックスには最初の状態ではコマンドボタンやピクチャーボックスなどのVB標準のコントロールしか出ていないので、 ここに我らが「Sampleole」コントロールを追加する必要があります。 絵の具で絵を描く前に、絵の具をパレットに出すようなものと考えてOKです。 Visual Basic Editorのメニュー 「ツール」→「その他のコントロール」を選ぶと、 このように現在登録されているコントロールがたくさん出てくるので、 例の項目を選びます。

 

 

● アイコンが出たぞ
 ツールボックスにアイコンが追加されます。一番下の「OCX」 という字が書いてあるのがそうです。このアイコンは、 Visual C++がOLEコントロールウィザードでデフォルトで作ったもので、 プロジェクトワークスペースの「{コントロール名}.bmp」 という名前のファイルを差し替えれば変更できます。

 

 

● 画面に配置
 ツールボックスに載ったコントロールは、 普通のコマンドボタンなどのコントロールと同様、 選択してウィンドウに張りつけていけばOKです。 張りつけると、楕円状の図形として表現されますが、 このコントロールの場合見えていても意味がないので、 本当のアプリとして実行する時には隠すとかしましょう。 画面左側のプロパティウィンドウで独自プロパティの設定なども可能です。

 

 

● コードを書く
 あとはSampleoleコントロールのメソッドやプロパティをコード中に書いていけばOKです。 自分で作ったコントロールにも、VBの自動文法補助機能がかかります。

    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で使ってみよう

● コントロールを選択
 PowerBuilderでも、大枠のつかみはVBとほぼ同じです。 ウィンドウペインタを開き、メニュー 「コントロール」→「OLE 2.0...」を選ぶと、 OLEオブジェクトの挿入ダイアログが出てきます。

 

 

 右端のタブをつつき、「OLEカスタムコントロール」として Sampleoleコントロールを選択します。

● ウィンドウに張りつける

 選択したら、カーソルが十字になるので、 ボタンやシングルラインエディットなどと同様、 そのままウィンドウに張りつけることができます。 ここでも我らがSampleoleコントロールは楕円の図形で表示されています。 右クリックでコントロールの名前を変えたり、 プロパティを変えたりもできるのですが、 VC++でコントロールを作るときに、 プロパティページの設定をまったくしていないので、 プロパティページのダイアログは出せません。

 

 

● コードを書く
 あとはコードを書いていけばOKです。

    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」 をつけ、その後にメソッド名やプロパティ名をつなげて書きます。
 

 

ActiveX&Java Top
(uploaded 2000/06/17 and not ever modified)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル