プロキシ/スタブの C コンパイラ定義
ヘッダー ファイル Rpcproxy.h には次のマクロ定義が含まれています。各マクロ定義は、分散 COM アプリケーションをビルドするときに便利な場合があります。 これらのマクロは、C コンパイル時に /D (または -D) プリプロセッサ スイッチを使用して呼び出されます。
MACRO | Description |
---|---|
REGISTER_PROXY_DLL | プロキシ DLL を自動的に登録するための DllMain、 DllRegisterServer、および DllUnregisterServer 関数を生成します。 |
PROXY_CLSID=<clsid> | サーバーのクラス識別子を指定します。 このマクロが定義されていない場合、既定の CLSID は、プロキシ/スタブ サーバーの IDL 仕様で MIDL コンパイラが検出する最初のインターフェイス識別子です。 |
PROXY_CLSID_IS={0x8hexdigits, 0x4hexdigits,0x4hexdigits, {0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits, 0x2hexdigits,}} | サーバーのクラス識別子の値をバイナリ 16 進形式で指定します。 |
Dlldata.c をコンパイルするときに REGISTER_PROXY_DLL マクロを定義することで、プロキシ/スタブ マーシャリング DLL には、 DllMain、 DllRegisterServer、 DllUnregisterServer 関数の既定の定義が自動的に含まれます。 これらの関数を使用して、システム レジストリにプロキシ DLL を自己登録できます。
この既定の登録コードでは、最初に検出されたインターフェイスの GUID を CLSID として使用して、プロキシ/スタブ DLL サーバー全体を登録します。 COM は後でこの CLSID を使用して、コンパイル済みのプロキシ/スタブ サーバーを見つけて読み込み、サーバーが処理するために登録されているインターフェイスのマーシャリングを行います。 アプリケーションが、スレッド、プロセス、またはコンピューターの境界を越えるインターフェイス メソッド呼び出しを行うと、COM はインターフェイス識別子レジストリ エントリを使用して、プロキシ/スタブ マーシャリング サーバーの CLSID レジストリ エントリを見つけます。 次に、この CLSID を使用してサーバーを読み込み (まだ読み込まれていない場合)、インターフェイス呼び出しをマーシャリングできるようにします。
既定の CLSID に依存するのではなく、プロキシ/スタブ サーバーの CLSID> を明示的に指定する場合は、PROXY_CLSID=<clsid マクロを使用します。 たとえば、標準のマーシャリング DLL を独自のインプロセス COM サーバーとして構築している場合や、DLL_PROCESS_ATTACHを処理するために独自の DllMain を定義する必要がある場合などです。
DEFINE_GUID マクロで使用 する 2 進 16 進数形式で CLSID の値を定義するには、 PROXY_CLSID の代わりに PROXY_CLSID_IS= マクロ を 使用します。
また、既定の DllRegisterServer 関数を実行すると、サーバーが ThreadingModel=Both に登録されることにも注意してください。
次のメイクファイルの例では、 REGISTER_PROXY_DLL マクロと PROXY_CLSID= マクロを使用します。
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 \
/DPROXY_CLSID=7a98c250-6808-11cf-b73b-00aa00b677a7
example_p.c
iids.obj : example_i.c
PROXYSTUBOBJS = dlldata.obj example.obj iids.obj
PROXYSTUBLIBS = kernel32.lib rpcns4.lib rpcrt4.lib uuid.lib
proxy.dll : $(PROXYSTUBOBJX) example.def
link /dll /out:proxy.dll /def:example.def
$(PROXYSTUBOBJS) $(PROXYSTUBLIBS)
regsvr32 /s proxy.dll
/D プリプロセッサ オプションの詳細については、C コンパイラのドキュメントを参照してください。