COM
とりあえず最低限のCOMプログラム
(2009. 7. 15)
お仕事でCOMを扱う事に。だいぶ前に触って「面倒臭い!」と投げていたままにしていたので、やり方をすっかり忘れていました。一先ず最低限のCOMプログラムを作ってみます。
1. VS2005開く
2. 新規プロジェクトでATLの[ATLプロジェクト]。名前はMyFirstATLにした。
3. ウィーザードは一先ずDLLを作るデフォルトで。
4. 完了
これでMyFirstATLというATLプロジェクトが出来上がり。ReleaseモードでビルドするとプロジェクトのReleaseフォルダに「MyFirstATL.dll」ができています。もちろん何もしない空っぽのDLLです。このままでは確認のしようもありません。
COMは部品化の技術なので、何か部品となる機能をつけようと思うわけです。何がいいかなと考えて、円の面積を求めるメソッドを追加する事にしました。
プロジェクトにはMyFirstATL.cpp、.hの他に.def、.idlなどいつもとは違うファイルも多数生成されています。これらのファイルの意味は一先ず置いておこう。追加するのは手でやるよりもウィザードを使った方が確実です(手で書く気にはなれないほど色々やることがあるのがATL)。
・ プロジェクトの上で右クリック
・ クラスを追加でATLシンプルオブジェクト選択。
・ ウィザードが立ち上がるので[短い名前]の所に「Area」と入れる。これがクラス名。
・ オプションはデフォルトで。
これでArea.cppとArea.h、そしてArea.rgsというファイルが追加されました。ここでクラスビューに切り替えるとIAreaというインターフェイスができています。この上で右クリックするとメソッドを追加できます。今回は円の面積なので、メソッド名を「Circle」、inパラメータには半径となるradius(FLOAT型)を追加です。outが出ないなぁと思っていたら型をポインタにしないといかんのね。ちょっとだけはまりました。出力はout(FLOAT*型)に。完了すればCircleメソッドが追加されます。
実装はArea.cppの「STDMETHODIMP CArea::Circle(FLOAT radius, FLOAT* out)」内に。自動生成されているので便利ですね。実装はこんな感じです:
STDMETHODIMP CArea::Circle(FLOAT radius, FLOAT* out)
{
*out = radius * radius * 3.14159265358979f;
return S_OK;
}
COMのメソッドはSTDMETHODIMPという値(実質HRESULTです)を返す事がお約束なので、値を返したい時は引数をポインタにします。実装は普通のC++です。
これをビルドするとArea::Circleメソッドが入ったCOMのDLLが完成〜。
○ 使ってみる
使う方法は色々。VBで使ってみる事にしました。
1. プロジェクトの新規作成
2. [他の言語]->[Visual Basic]->[Windows アプリケーション]。ATLTestという名前にしました。
これでVBのプロジェクトが立ち上がります。何も置かれていないフォームが1つあるはずなので、ボタン1つとテキストボックス2つを置きました:
上が半径、下が答え。ボタンを押したら計算という算段です。ボタンの実装をするのですが、その前に[プロジェクト]->[参照の追加]で先ほど作ったCOMを読み込みます。MyFirstATLを探してOKするとVBで自分のCOMが使えるようになります。実装ははこんな感じ(VB久しいなぁ〜(笑)):
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim radius As Double
Dim answer As Double
Dim AreaCom As MyFirstATLLib.Area
radius = TextBox1.Text
AreaCom = New MyFirstATLLib.Area
AreaCom.Circle(radius, answer)
TextBox2.Text = answer
End Sub
End Class
VBもかなり忘れています(笑)。ポイントはMyFirstATLLib.AreaというCOMのクラスを作る所ですね。Newを忘れずにです。後は先に作っていたCircleメソッドが呼べるので、テキストボックスに出力です。結果はこういう感じに:
ちゃんと出ました。小さな一歩です。COMで色々と作りたくなりますが、仕事で求められているのはDirectXとの融合…ど、ど、どうするんだろう…。色々調べなくちゃ(汗)
備忘録長すぎたな・・・