COMメモ9 インスタンスの生成

// Ole32.dll   Objbase.h
   HRESULT __stdcall CoCreateInstance(
      const CLSID& rclsid,
      IUnknown* pUnkOuter,
      DWORD dwClsContext,
      const IID& riid,
      void**  * ppv
    );
    CoCreateInstance

  • CLSIDを受け取り対応するコンポーネントのインスタンスを作成、そのインターフェースを返す関数
  • 内部でクラスファクトリ(IClassFactory)を呼び出している
  • CLSID:コンポーネントの識別子、レジストリでCLSIDからDLLのファイルパスを取得できるようになっている。
  • pUnkOuter:実装に集約という手法を用いる場合に使う、使わない場合はNULL
  • ClsContext:コンポーネントの実行場所をフラグで設定 クライアントと同じプロセス(DLL)/別のプロセス(.exe)/別マシン(DCOM)
  • riid 返されるインターフェイスのIID
  • ppv:インターフェイスへのポインタを受け取る変数
    クラスファクトリ

  • 他のコンポーネントを作成するためのコンポーネント
  • IClassFactoryを実装
  • CoGetClassObject(CLSID)でIClassFactoryインターフェイスを取得する。
  • 1CLSIDにつき1クラスファクトリ
  • 対応するコンポーネントを含むDllに自分で実装
interface IClassFactory :IUnknown
{
    HRESULT __stdcall CreateInstance(IUnknown * pUnknownOuter, const IID& iid, void **ppv);
    HRESULT __stdcall LockServer(BOOL block)
}

HRESULT __stdcall CoGetClassObject(
    const CLSID& clsid,
    DWORD dwClsContext,
    COSERVERINFO* pServerInfo,
    const IID& iid,
    void** ppv
    );
    CoGetClassObject

  • CLSIDを受け取り、対応するコンポーネントを生成するクラスファクトリのインターフェイスへのポインタを返す。
  • DLLGetClassObject()を呼び出す。
  • COSERVERINFO:DCOM(≒リモートPC上にコンポーネントがある場合)のアクセス制御に用いる

STDAPI DllGetClassObject(
    const CLSID& clsid,
    const IID& iid,
    void** ppv
    );
    DllGetClassObject

  • CLSIDを受け取り、対応するコンポーネントを生成するクラスファクトリのインターフェイスへのポインタを返す。
  • コンポーネントを含むDLLに自分で実装する。
広告

akatukisiden について

フリーランスプログラマ 使用言語はC++,C#とそのつなぎのC++/CLI 専門はクライアントアプリ開発
カテゴリー: その他, C++, COM タグ: , , , , , , , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中