...ing logging 4.0

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

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

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

前回の記事で、IFileOpenDialogのCOMインタフェースを使う準備をしました。

COMの初期化

COMを使うには、何はともあれ初期化しないと始まりません。

CoInitialize 関数 (objbase.h) - Win32 apps | Microsoft Learn

CoInitializeEx 関数 (combaseapi.h) - Win32 apps | Microsoft Learn

COMを初期化する関数といえば、CoInitialize関数ですが、 CoInitializeEx関数を使えと書いてあるので、そうします。

combaseapi.hとObjbase.hで宣言されていると書いてあるので調べると、 D言語のcore.sys.windows.objbaseが見つかったので、これをインポートします。

CoInitializeExの第2引数は、今回はコンソールアプリなので、 COINIT.COINIT_MULTITHREADEDにしておきます。

COMの解放

次に、COMの解放処理といえばCoUninitialize関数です。

CoUninitialize 関数 (combaseapi.h) - Win32 apps | Microsoft Learn

とりあえずここまででCOMの初期化と解放の定型文が書けて、コンパイルできるようになります。

import core.sys.windows.windef;
import core.sys.windows.com;
import core.sys.windows.objbase;

void main()
{
    HRESULT hr;

    hr = CoInitializeEx(null, COINIT.COINIT_MULTITHREADED);
    if (FAILED(hr)) return;
    scope(exit) CoUninitialize();

    // ここにCOMを使うコードを書いていく
}