建置和註冊 Proxy DLL
如果您選擇應用程式的 Proxy/存根封送處理,則 MIDL 產生的 .c 和 .h 檔案必須編譯並連結以建立 Proxy DLL,而且該 DLL 必須輸入系統登錄,用戶端才能找到您的介面。 MIDL 產生的檔案 Dlldata.c 包含建置和註冊 Proxy/存根 DLL 所需的例程和其他資訊。
建置 DLL 的第一個步驟是撰寫連結器模組定義檔,如下列範例所示:
LIBRARY example.dll
DESCRIPTION 'generic proxy/stub DLL'
EXPORTS DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE
或者,您可以在 makefile 的 LINK 命令行上指定這些導出的函式。
導出的函式會在 Rpcproxy.h 中宣告,Dlldata.c 包含此函式,而預設實作是 RPC 運行時間連結庫的一部分。 COM 會使用這些函式來建立類別處理站、卸除 DLL(確定沒有任何物件或鎖定存在之後)、擷取 Proxy DLL 的相關信息,以及自行註冊和取消註冊 Proxy DLL。 若要利用這些預先定義的函式,您必須在編譯 Dlldata.c 和 Example_p.c 檔案時叫用 Cpreprocessor /D (或 -D) 選項,如下列 makefile 所示:
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 中的宏會展開為 nothing。您必須在另一個原始程式檔中明確定義它們,其模組也會包含在 C 編譯程式命令行上的最終連結和編譯中。
定義REGISTER_PROXY_DLL時,Rpcproxy.h 會使用 PROXY_CLSID=guid、PROXY_CLSID_IS=guid 的明確值,以及 ENTRY_PREFIX=prefix 字元串來提供額外的條件式編譯控件。 這些宏定義在 MIDL 程式設計人員指南中 適用於 Proxy/Stubs 的 C 編譯程式定義中會更詳細地說明。
手動註冊 Proxy DLL
如果基於某些原因,您無法使用預設 Proxy 存根註冊例程,您可以使用 Regedt32.exe,將下列專案新增至系統登錄,以手動註冊 DLL。
HKEY_CLASSES_ROOT
Interface
iid
(Default) = ICustomInterfaceName
ProxyStubClsid32 = {clsid}
HKEY_CLASSES_ROOT
CLSID
clsid
(Default) = ICustomInterfaceName_PSFactory
InprocServer32 = proxstub.dll
相關主題