プロキシ 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
関連トピック