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


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

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

МАКРОС Описание
REGISTER_PROXY_DLL Создает dllMain, DllRegisterServerи функции dllUnregisterServer DllUnregisterServer для автоматической регистрации библиотеки DLL-сервера.
PROXY_CLSID=<clsid> Указывает идентификатор класса для сервера. Если этот макрос не определен, clSID по умолчанию является первым идентификатором интерфейса, который компилятор MIDL встречает в спецификации IDL для прокси-сервера или заглушки.
PROXY_CLSID_IS={0x8hexdigits, 0x4hexdigits0x4hexdigits, {0x2hexdigits0x2hexdigits, 0x0x 2hexdigits,0x2hexdigits, 0x2hexdigits0x2hexdigits, 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.