...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

D言語でMicrosoft Component Object Model (COM) を使う (その20)

D言語 Advent Calendar 2025 25日目の記事です。

今回は全20回の記事の締めくくりとなります。

その1でCOMインタフェースを使うために必要な宣言や定義の準備ができて、 その2でCOMの初期化と解放ができるようになりました。 その3では実際にファイルを開くダイアログを表示することができ、その4では選択したファイルのパスを取得できました。 その5ではQueryInterfaceを使って別のCOMインタフェースを取得して、ファイル作成日時を取得できました。 その6ではCOMインタフェースをアップキャストもダウンキャストもできないことを説明しました。

その7ではCOMオブジェクトとCOMインタフェースを自作するための準備をしました。 その8とその9では自作COMファクトリをCOMサーバーとして登録し、 自作COMオブジェクトと自作COMインタフェースを作成できました。 その10では既存のCOMインタフェースを拡張した新しいCOMインタフェースとCOMオブジェクトを作成しました。 その11では、COMファクトリクラスを拡張して、新しいCOMインタフェースを使えました。

その12では、AddRefメソッドとReleaseメソッドを自分で呼ばなくていいように ComPtrというスマートポインタを作ることにしましたが、 その13では構築と破棄を同じ回数捉えることができませんでした。 その14ではコピーコンストラクタだけでスマートポインタを作る実験をしました。 その15ではComPtrを実際に使うことができました。 その16ではComPtrにasメソッドを追加してQueryInterfaceを隠ぺいしました。

その17ではCOMの基盤の上に作られているWinRTをD言語で使う準備をしました。 その18では、WinRTインタフェースを使いましたがアプリが一瞬で終了してしまいました。 その19ではメッセージループを追加し、WinRTを使ってメッセージダイアログを正しく表示できました。

総括

始まりはここからでした。

DFL with WinRTを試していて、D言語はCOMを使うのに向いていると思ったので、D言語でのCOMの使い方をだらだら書いて行きます。

D言語がCOMを使うのに向いていると感じるのはなぜかを考えてみると、 どちらもネイティブコードなので、親和性が高いのかなと思います。 C#のマーシャリングとかで謎の属性が大量に付いているとか、 そういうのがほとんどなく、コードがスッキリしていて明快です。

逆に、D言語でCOMを使うときに一番ネックになるのは、 D言語コンパイラに付属されているcore.sys.windows.*が古くて、 Vista以降に追加されたAPIが定義されていないことでしょう。 本来であればC/C++のヘッダーを自動変換して生成するのでしょうが、 特定のAPIしか使わないなら人力で変換してもなんとかなることを実演しました。 強いて言えば、注意が必要なのは、extern(Windows)を忘れないことと、 引数のポインタの数くらいですかね。

一方、WinRTまで進むと、投影(プロジェクション)なしに、生のWinRTを使うのは無理が出てきますね。 特に、非同期処理に手ぶらで挑むのは厳しそうでした。 C#のawaitや、C++/WinRTのco_awaitに相当する仕組みを、D言語にも用意してやれば使い勝手はよくなるでしょう。

WinRTのD言語プロジェクションであるdwinrtを使えば、 その辺りはフォローされているので、興味があれば試してみてください。

拙作のD言語Windows GUIライブラリDFLは、 dwinrtと一緒に使うこともできますよ。

それでは!