Создание и регистрация DLL-прокси
Если вы выбрали маршалинг с использованием прокси или заглушки для вашего приложения, файлы .c и .h, созданные MIDL, должны быть скомпилированы и связаны для создания прокси-библиотеки 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 файла makefile.
Экспортируемые функции объявляются в Rpcproxy.h, который включается в dlldata.c, а реализации по умолчанию являются частью библиотеки времени выполнения RPC. COM использует эти функции для создания фабрики классов, выгрузки DLL (после того, как убедятся в отсутствии объектов или блокировок), получения информации о proxy DLL, а также для самостоятельной регистрации и отмены регистрации этой proxy DLL. Чтобы воспользоваться этими предопределенными функциями, необходимо вызвать параметр Cpreprocessor /D (или -D) при компиляции файлов Dlldata.c и Example_p.c, как показано в следующем файле 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=явное значение guidи ENTRY_PREFIX=префиксной строкой. Эти определения макросов подробно описаны в определениях компилятора C для прокси/заглушек в руководстве программиста MIDL.
Регистрация библиотеки DLL прокси-сервера вручную
Если по какой-то причине вы не можете использовать процедуры регистрации заглушки прокси-сервера по умолчанию, можно вручную зарегистрировать библиотеку DLL, добавив следующие записи в системный реестр с помощью Regedt32.exe.
HKEY_CLASSES_ROOT
Interface
iid
(Default) = ICustomInterfaceName
ProxyStubClsid32 = {clsid}
HKEY_CLASSES_ROOT
CLSID
clsid
(Default) = ICustomInterfaceName_PSFactory
InprocServer32 = proxstub.dll
Связанные разделы