Поделиться через


Определения компилятора C для прокси-сервера или заглушки

Файл заголовка Rpcproxy.h содержит следующие определения макросов, каждое из которых может быть удобно при создании распределенного COM-приложения. Эти макросы вызываются с помощью параметра препроцессора /D (или -D) во время компиляции C.

MACRO Описание
REGISTER_PROXY_DLL Создает функции DllMain, DllRegisterServer и DllUnregisterServer для автоматической регистрации прокси-библиотеки DLL.
PROXY_CLSID=<clsid> Указывает идентификатор класса для сервера. Если этот макрос не определен, clSID по умолчанию — это первый идентификатор интерфейса, который компилятор MIDL обнаруживает в спецификации IDL для прокси-сервера или сервера-заглушки.
PROXY_CLSID_IS={0x8hexdigits, 0x4hexdigits,0x4hexdigits, {0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits, 0x2hexdigits,0x2hexdigits,}} Задает значение идентификатора класса сервера в двоичном шестнадцатеричном формате.

 

Определив макрос REGISTER_PROXY_DLL при компиляции Dlldata.c, библиотека DLL для маршалинга прокси-сервера или заглушки автоматически включает определения по умолчанию для функций DllMain, DllRegisterServer и DllUnregisterServer . Эти функции можно использовать для самостоятельной регистрации прокси-библиотеки DLL в системном реестре.

Этот код регистрации по умолчанию использует GUID первого обнаруженного интерфейса в качестве ИДЕНТИФИКАТОРа CLSID для регистрации всего прокси-сервера или сервера DLL-заглушки. Позже COM использует этот ИДЕНТИФИКАТОР CLSID для поиска и загрузки скомпилированного прокси-сервера или сервера-заглушки для маршалинга любого из интерфейсов, для обработки которые зарегистрирован сервер. Когда приложение выполняет вызов метода интерфейса, который пересекает границы потока, процесса или компьютера, COM использует запись реестра идентификаторов интерфейса для поиска записи реестра CLSID для сервера маршалинга прокси-сервера или заглушки. Затем он использует этот ИДЕНТИФИКАТОР CLSID для загрузки сервера (если он еще не загружен), чтобы затем можно было маршалировать вызов интерфейса.

Используйте макрос PROXY_CLSID=<clsid> , если требуется явно указать CLSID прокси-сервера или сервера-заглушки, а не полагаться на CLSID по умолчанию. Например, если вы создаете стандартную библиотеку DLL маршалинга в качестве собственного внутрипроцессного COM-сервера или если необходимо определить собственный dllMain для обработки DLL_PROCESS_ATTACH.

Используйте макрос PROXY_CLSID_IS= вместо PROXY_CLSID , чтобы определить значение CLSID в двоичном шестнадцатеричном формате, используемом макросом DEFINE_GUID .

Также обратите внимание, что при запуске функции DllRegisterServer по умолчанию сервер регистрируется с помощью ThreadingModel=Both.

В следующем примере makefile используются макросы REGISTER_PROXY_DLL и PROXY_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.