古のATLのWindows8以降?版のWRLを使ってみる。
IXMLHTTPRequest2を使うサンプルコードをベースにWRL化してみる。
ComPtr 何はともあれComPtrを取り入れる。 Before
SAFERELEASEとgoto
ComPtrを取り入れてSAFERELEASEとgotoを除去しよう。 After RAIIを取り入れて積極的にEarly Outできる(後始末が自動になったので)。
IUnknown実装とComPtr初期化
Callbackの定義等で自らComオブジェクトを定義する場合がある。 IXMLHTTPRequest2Callbackを実装する例。 Before
IUnknownの実装(AddRef, Release, QueryInterface)が定型コードである
newしたときにリファレンスカウントが1であること、AddRef, Releaseを正しく実装する QueryInterfaceを正しく実装する(あとでインタフェースを増減させたときに更新を忘れたりする)
ComPtrの初期化が不穏
または、
のようなあからさまに不穏なコードを書かなければならない。 間違いの元である。 After
とすることでIUnknownの実装をWRL::RuntimeClassに任せることができる。 また、newによる初期化を禁止されるので、newではなくWRL::Makeを使う。
MakeAndInitialize 初期化メソッド
Makeよりこっちの方がCom風。 RuntimeClassInitializeという名前のメンバ関数で初期化する。失敗した場合はS_OK以外を返す。
MakeAndInitialize 初期化メソッド(引数) 9つまでいける。