開発環境の移行も兼ねて、VS.NET 2003でATLを使ったプログラムを書いてみました。
CStringがテンプレートでサポートされたということを聞いたので、MFCを使わなくてもCStringが使えるのは嬉しいです。
早速、テスト用のATLプロジェクトを作って、ATLオブジェクトを追加してみるとIDLファイルが見当たらない。
なぁんと、属性なんて機能がサポートされていて、.hファイルに以下のような記述があります。
// IITestObject
[
object,
uuid("ADCC4CC3-B2E2-4D7E-BF17-C62D65E87188"),
dual, helpstring("IITestObject インターフェイス"),
pointer_default(unique)
]
__interface IITestObject : IDispatch
{
};
// CITestObject
[
coclass,
threading("apartment"),
vi_progid("xxxText.ITestObject"),
progid("xxxText.ITestObject.1"),
version(1.0),
uuid("1BE1910F-0893-4936-B87F-B064E515D3E4"),
helpstring("ITestObject Class")
]
rgsファイルの内容もかなりシンプルになっていて、こんな感じ。
HKCR
{
NoRemove AppID
{
'%APPID%' = s 'xxxText'
'xxxText.DLL'
{
val AppID = s '%APPID%'
}
}
}
早速、メソッドを追加してCStringがMFCなしで使えるのかを確認するとOKでした。
しかし、便利な属性機能ですが今までの表記がいいので、別のプロジェクトを作りました。
その時に属性オプションのチェックを外すと、以前のようにIDLファイルも作成されます。
こっちの方がわかりやすくていいなぁと思って、作業を進めていくとCStringを使っている箇所でコンパイルエラーが発生!!
必要なヘッダファイルとかをincludeしてもダメ。
詳しくは見てませんが、属性をONにしていないとCStringが使えないようです。
プロジェクトの違いを比較してみると、プリプロセッサで_ATL_ATTRIBUTESが定義されています。
これを属性OFFで作ったプロジェクトに追加すると、ちゃんと動くではありませんか。
なんだこれ? こういうやり方でいいのかは不明ですが、一応CStringクラスが動くようにはなりました。
新しい環境に移行していくのって大変だなぁ。