ホーム < ゲームつくろー! < IKD備忘録

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との融合…ど、ど、どうするんだろう…。色々調べなくちゃ(汗)


備忘録長すぎたな・・・