プロキシ DLL のビルドと登録

アプリケーションのプロキシ/スタブ マーシャリングを選択した場合は、MIDL によって生成された .c ファイルと .h ファイルをコンパイルしてリンクしてプロキシ DLL を作成する必要があります。クライアントがインターフェイスを見つけられるように、その DLL をシステム レジストリに入力する必要があります。 MIDL で生成されたファイル Dlldata.c には、プロキシ/スタブ DLL をビルドして登録するために必要なルーチンとその他の情報が含まれています。

DLL をビルドする最初の手順は、次の例に示すように、リンカーのモジュール定義ファイルを記述することです。

LIBRARY        example.dll
DESCRIPTION    'generic proxy/stub DLL'
EXPORTS        DllGetClassObject      @1 PRIVATE
               DllCanUnloadNow        @2 PRIVATE
               DllRegisterServer      @4 PRIVATE
               DllUnregisterServer    @5 PRIVATE
 

または、メイクファイルの LINK コマンド ラインで、これらのエクスポートされた関数を指定することもできます。

エクスポートされた関数は、Dlldata.c に含まれる Rpcproxy.h で宣言され、既定の実装は RPC ランタイム ライブラリの一部です。 COM はこれらの関数を使用して、クラス ファクトリの作成、DLL のアンロード (オブジェクトまたはロックが存在しないことを確認した後)、プロキシ DLL に関する情報の取得、およびプロキシ DLL の自己登録と登録解除を行います。 これらの定義済み関数を利用するには、次のメイクファイルに示すように、Dlldata.c ファイルと Example_p.c ファイルをコンパイルするときに Cpreprocessor /D (または -D) オプションを呼び出す必要があります。

example.h example.tlb example_p.c example_i.c dlldata.c : example.idl
    midl example.idl
dlldata.obj : dlldata.c
    CL /c /DWIN32 /DREGISTER_PROXY_DLL dlldata.c
example.obj : example_p.c
    CL /c /DWIN32 /DREGISTER_PROXY_DLL example_p.c
iids.obj : example_i.c
PROXYSTUBOBJS = dlldata.obj example.obj iids.obj
PROXYSTUBLIBS = kernel32.lib rpcndr.lib rpcns4.lib rpcrt4.lib uuid.lib
proxy.dll : $(PROXYSTUBOBJS) example.def
    link /dll /out:proxy.dll /def:example.def
        $(PROXYSTUBOBJS) $(PROXYSTUBLIBS)
    regsvr32 /s proxy.dll
 

コンパイル時にこれらのプリプロセッサ定義を指定しない場合、これらの関数は自動的には定義されません。 (つまり、Rpcproxy.c のマクロは何にも展開されません)。別のソース ファイルで明示的に定義する必要があります。そのモジュールは、C コンパイラコマンド ラインの最終的なリンクとコンパイルにも含まれます。

REGISTER_PROXY_DLLが定義されている場合、Rpcproxy.h は、PROXY_CLSID=guid、PROXY_CLSID_IS=明示的な guid 値、および ENTRY_PREFIX=prefix 文字列を使用した追加の条件付きコンパイル制御を提供します。 これらのマクロ定義については、MIDL プログラマ ガイドの 「プロキシ/スタブ の C コンパイラ定義」で詳しく説明されています。

プロキシ DLL を手動で登録する

何らかの理由で既定のプロキシ スタブ登録ルーチンを使用できない場合は、Regedt32.exeを使用して、次のエントリをシステム レジストリに追加することで、DLL を手動で登録できます。

HKEY_CLASSES_ROOT
   Interface
      iid
         (Default) = ICustomInterfaceName
         ProxyStubClsid32 = {clsid}
HKEY_CLASSES_ROOT
   CLSID
      clsid
         (Default) = ICustomInterfaceName_PSFactory
         InprocServer32 = proxstub.dll

プロキシ/スタブの C コンパイラ定義

COM サーバーの登録

自己登録