次の方法で共有


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

ヘッダー ファイル Rpcproxy.h には次のマクロ定義が含まれています。各マクロ定義は、分散 COM アプリケーションをビルドするときに便利な場合があります。 これらのマクロは、C コンパイル時に /D (または -D) プリプロセッサ スイッチを使用して呼び出されます。

MACRO Description
REGISTER_PROXY_DLL プロキシ DLL を自動的に登録するための DllMainDllRegisterServer、および 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 には、 DllMainDllRegisterServerDllUnregisterServer 関数の既定の定義が自動的に含まれます。 これらの関数を使用して、システム レジストリにプロキシ 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 コンパイラのドキュメントを参照してください。