COM (Component Object Model)

COMとはプログラムを部品化し再利用するための技術で、これに基づいて作成された部品をCOMコンポーネントと呼びます。

  • コンテナ (クライアント) … データを要求するアプリケーション
  • サーバ … データを提供するアプリケーション
COMとは|Component Object Model - 意味/定義 : IT用語辞典

インターフェイス

IUnknown

すべてのCOMインターフェイスが継承するインターフェイスであり、他のインターフェイスへのポインタを取得したり、オブジェクトの実体を管理したりできます。IUnknown (unknwn.h) | Microsoft Docs

メソッド 機能
IUnknown::AddRef Increments the reference count for an interface on an object. This method should be called for every new copy of a pointer to an interface on an object.
IUnknown::QueryInterface Retrieves pointers to the supported interfaces on an object.
IUnknown::Release Decrements the reference count for an interface on an object.
Methods - IUnknown (unknwn.h) | Microsoft Docs

QueryInterface

オブジェクトでサポートされているインターフェイスへのポインタを取得できます。

HRESULT QueryInterface(
  REFIID riid,
  void   **ppvObject
);
IUnknown::QueryInterface(REFIID,void) (unknwn.h) | Microsoft Docs

インターフェイスの識別子は、IID_PPV_ARGSマクロで取得できます。

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
IID_PPV_ARGS macro (combaseapi.h) | Microsoft Docs

たとえばinterface1へポインタを取得しinterface2へ代入するには、次のようにします。

HRESULT hr = interface1->QueryInterface(IID_PPV_ARGS(interface2));
戻り値 意味
S_OK インターフェイスがサポートされている
E_NOINTERFACE インターフェイスがサポートされていない
E_POINTER ppvObjectがNULL

データ型

BSTR (Basic STRing or binary string)

typedef OLECHAR *BSTR;

typedef WCHAR OLECHAR;

typedef wchar_t WCHAR;
String Manipulation Functions [Automation] | MSDN

文字列を作成するにはSysAllocString()を呼びます。

BSTR SysAllocString(const OLECHAR *sz);
SysAllocString Function | MSDN

そしてそれを解放するにはSysFreeString()を用います。

VOID SysFreeString(BSTR bstr);
SysFreeString Function | MSDN

char*との相互変換

BSTR → char*
char* __stdcall ConvertBSTRToString(
   BSTR pSrc
);
ConvertBSTRToString | MSDN

omsuppw.libまたはcomsuppwd.libを依存ファイルに追加します。

BSTR bstrText = ::SysAllocString(L"Test");
char* charText = _com_util::ConvertBSTRToString(bstrText);

// ...

SysFreeString(bstrText);
delete[] charText;

ConvertBSTRToString()から返されたポインタを移動してはなりません。移動するとSysFreeString()でアクセス違反となります。

char* → BSTR
BSTR __stdcall ConvertStringToBSTR(
   const char* pSrc
)
ConvertStringToBSTR | MSDN

初期化

CoInitializeEx

HRESULT CoInitializeEx(
  _In_opt_ LPVOID pvReserved,
  _In_     DWORD  dwCoInit
);
CoInitializeEx function (COM) | MSDN
HRESULT result = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

関連技術

ActiveX

ActiveXとは、ネットワークを通じて異なるコンピュータを連携させたり、データやプログラム部品をやり取りするための技術です。ActiveXとは - 意味/定義 : IT用語辞典

  • OLE (Object Linking and Embedding) … アプリケーションソフトウェア間でデータを転送、共有するための仕組み。複合ドキュメント (compound documents)
    • COM (Component Object Model) … プログラムを部品化し、再利用するためのコンポーネント技術
      • ActiveX … インターネット関連技術の総称。インターネット対応コンポーネント (Internet-enabled components)
        • ActiveXコントロール … ActiveX仕様のソフトウェア コンポーネント。OLEコントロールを、インターネット対応に拡張したもの

ActiveXコントロール (ActiveX Control)

ActiveXコントロールとは、Webサーバからソフトウェア部品を受信し実行できる、Internet Explorerのコンポーネント技術です。これはCOMのインプロセス サーバ (DLL) として実現されています。

COM+

COMの改良版です。

複数の技術系サイトから、まとめて検索