建置和註冊 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

Proxy/Stubs 的 C-Compiler 定義

註冊 COM 伺服器

自我註冊