生成和注册代理 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
相关主题