生成和注册代理 DLL

如果为应用程序选择了代理/存根封送处理,则必须编译和链接 MIDL 生成的 .c 和 .h 文件,以创建代理 DLL,并且必须将该 DLL 输入到系统注册表中,以便客户端可以找到接口。 MIDL 生成的文件 Dlldata.c 包含生成和注册代理/存根 DLL 所需的例程和其他信息。

生成 DLL 的第一步是为链接器编写模块定义文件,如以下示例所示:

LIBRARY        example.dll
DESCRIPTION    'generic proxy/stub DLL'
EXPORTS        DllGetClassObject      @1 PRIVATE
               DllCanUnloadNow        @2 PRIVATE
               DllRegisterServer      @4 PRIVATE
               DllUnregisterServer    @5 PRIVATE
 

或者,可以在生成文件的 LINK 命令行上指定这些导出的函数。

导出的函数在 Rpcproxy.h 中声明,Dlldata.c 包括这些函数,默认实现是 RPC 运行时库的一部分。 COM 使用这些函数创建类工厂、卸载 DLL(确保不存在对象或锁定后)、检索有关代理 DLL 的信息,以及自行注册和注销代理 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 中的宏扩展到无。)必须在另一个源文件中显式定义它们,其模块也将包含在 C 编译器命令行的最终链接和编译中。

定义 REGISTER_PROXY_DLL 后,Rpcproxy.h 会提供采用 PROXY_CLSID=guid、PROXY_CLSID_IS=explicit value of guid 和 ENTRY_PREFIX=prefix string 的其他编辑控件。 《MIDL 程序员指南》中的代理/存根的 C 编译器定义中更详细地描述了这些宏定义。

手动注册代理 DLL

如果由于某种原因无法使用默认代理存根注册例程,则可以使用 Regedt32.exe 将以下条目添加到系统注册表中,以便手动注册 DLL。

HKEY_CLASSES_ROOT
   Interface
      iid
         (Default) = ICustomInterfaceName
         ProxyStubClsid32 = {clsid}
HKEY_CLASSES_ROOT
   CLSID
      clsid
         (Default) = ICustomInterfaceName_PSFactory
         InprocServer32 = proxstub.dll

代理/存根的 C 编译器定义

注册 COM 服务器

自注册