Proxy/Stub 的 C 編譯器定義

標頭檔 Rpcproxy.h 包含下列巨集定義,其中每個定義在建置分散式 COM 應用程式時可能很方便。 這些宏會在 C 編譯時期使用 /D (或 -D) 預處理器參數來叫用。

MACRO Description
REGISTER_PROXY_DLL 產生 DllMainDllRegisterServerDllUnregisterServer 函式,以自動註冊 Proxy DLL。
PROXY_CLSID= < clsid> 指定伺服器的類別識別碼。 如果未定義這個宏,預設 CLSID 是 MIDL 編譯器在 Proxy/Stub 伺服器的 IDL 規格中遇到的第一個介面識別碼。
PROXY_CLSID_IS={0x8hexdigits, 0x4hexdigits,0x4hexdigits, {0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits,}} 以二進位十六進位格式指定伺服器類別識別碼的值。

 

藉由在編譯 Dlldata.c 時定義 REGISTER_PROXY_DLL 宏,Proxy/stub 封送處理 DLL 會自動包含 DllMainDllRegisterServerDllUnregisterServer 函式的預設定義。 您可以使用這些函式在系統登錄中自行註冊 Proxy DLL。

此預設註冊程式碼會使用第一個介面的 GUID 作為 CLSID 來註冊整個 Proxy/存根 DLL 伺服器。 COM 稍後會使用此 CLSID 來尋找並載入已編譯的 Proxy/存根伺服器,以便封送處理伺服器所註冊的任何介面。 當應用程式進行跨執行緒、進程或電腦界限的介面方法呼叫時,COM 會使用介面識別碼登錄專案來尋找 Proxy/Stub 封送處理伺服器的 CLSID 登錄專案。 然後,如果尚未載入伺服器) ,則會使用此 CLSID 載入伺服器 (,以便接著封送處理介面呼叫。

當您想要明確指定 Proxy/存根伺服器的 CLSID,而不是依賴預設 CLSID 時,請使用 PROXY_CLSID= < clsid > 宏。 例如,如果您要建置標準封送處理 DLL 做為您自己的同進程 COM 伺服器,或如果您需要定義自己的 DllMain 來處理DLL_PROCESS_ATTACH。

使用 PROXY_CLSID_IS= 宏,而不是 PROXY_CLSID ,以 DEFINE_GUID 宏所使用的二進位十六進位格式定義 CLSID 的值。

另請注意,當預設 DllRegisterServer 函 式執行時,它會向 ThreadingModel=Both 註冊伺服器。

下列 makefile 範例會使用 REGISTER_PROXY_DLLPROXY_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 編譯器檔。