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

头文件 Rpcproxy.h 包含以下宏定义,其中每个定义在生成分布式 COM 应用程序时可能很方便。 这些宏是在 C 编译时使用 /D (或 -D) 预处理器开关调用的。

MACRO 说明
REGISTER_PROXY_DLL 生成 DllMainDllRegisterServerDllUnregisterServer 函数,以便自动注册代理 DLL。
PROXY_CLSID=<clsid> 指定服务器的类标识符。 如果未定义此宏,则默认 CLSID 是 MIDL 编译器在 Proxy/Stub 服务器的 IDL 规范中遇到的第一个接口标识符。
PROXY_CLSID_IS={0x8hexdigits0x4hexdigits0x4hexdigits, {0x2hexdigits0x2hexdigits0x2hexdigits0x2hexdigits0x2hexdigits,0x2hexdigits0x2hexdigits,}} 以二进制十六进制格式指定服务器的类标识符的值。

 

通过在编译 Dlldata.c 时定义 REGISTER_PROXY_DLL 宏,代理/存根封送 DLL 将自动包含 DllMainDllRegisterServerDllUnregisterServer 函数的默认定义。 可以使用这些函数在系统注册表中自行注册代理 DLL。

此默认注册代码使用第一个接口的 GUID 作为 CLSID 来注册整个代理/存根 DLL 服务器。 COM 稍后使用此 CLSID 来查找和加载编译的代理/存根服务器,以便封送服务器要处理的任何接口。 当应用程序发出跨线程、进程或计算机边界的接口方法调用时,COM 使用接口标识符注册表项查找代理/存根封送服务器的 CLSID 注册表项。 然后,如果尚未加载) ,则使用此 CLSID 加载服务器 (,以便随后可以封送接口调用。

如果要显式指定代理/存根服务器的 CLSID 而不是依赖于默认 CLSID,>请使用 PROXY_CLSID=<clsid 宏。 例如,如果要将标准封送 DLL 构建为自己的进程内 COM 服务器,或者需要定义自己的 DllMain 来处理DLL_PROCESS_ATTACH。

使用 PROXY_CLSID_IS= 宏而不是 PROXY_CLSID ,以 DEFINE_GUID 宏使用的二进制十六进制格式定义 CLSID 的值。

另请注意,当默认 DllRegisterServer 函数运行时,它将服务器注册到 ThreadingModel=Both。

以下生成文件示例使用 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 编译器文档。