Criando e registrando uma DLL de proxy
Se você escolheu o empacotamento de proxy/stub para seu aplicativo, os arquivos .c e .h gerados pelo MIDL devem ser compilados e vinculados para criar uma DLL de proxy, e essa DLL deve ser inserida no registro do sistema para que os clientes possam localizar suas interfaces. O arquivo Dlldata.c gerado pelo MIDL contém as rotinas necessárias e outras informações para criar e registrar uma DLL proxy/stub.
A primeira etapa na criação da DLL é gravar um arquivo de definição de módulo para o vinculador, conforme mostrado no exemplo a seguir:
LIBRARY example.dll
DESCRIPTION 'generic proxy/stub DLL'
EXPORTS DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE
Como alternativa, você pode especificar essas funções exportadas na linha de comando LINK do makefile.
As funções exportadas são declaradas em Rpcproxy.h, que Dlldata.c inclui, e as implementações padrão fazem parte da biblioteca de tempo de execução RPC. COM usa essas funções para criar uma fábrica de classes, descarregar DLLs (depois de certificar-se de que nenhum objeto ou bloqueios existem), recuperar informações sobre a DLL proxy e para auto-registrar e cancelar o registro da DLL proxy. Para aproveitar essas funções predefinidas, você precisa invocar a opção Cpreprocessor /D (ou -D) ao compilar os arquivos Dlldata.c e Example_p.c, conforme mostrado no makefile a seguir:
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
Se você não especificar essas definições de pré-processador em tempo de compilação, essas funções não serão definidas automaticamente. (Ou seja, as macros em Rpcproxy.c se expandem para nada.) Você teria que tê-los definido explicitamente em outro arquivo de origem, cujo módulo também seria incluído na vinculação final e compilação na linha de comando do compilador C.
Quando REGISTER_PROXY_DLL é definido, Rpcproxy.h fornece controle de compilação condicional adicional com PROXY_CLSID=guid, PROXY_CLSID_IS=valor explícito de guid e ENTRY_PREFIX=prefix string. Essas definições de macro são descritas com mais detalhes em C-Compiler Definitions for Proxy/Stubs no MIDL Programmer's Guide.
Registrando manualmente a DLL do proxy
Se, por algum motivo, você não puder usar as rotinas de registro de stub de proxy padrão, poderá registrar manualmente a DLL adicionando as seguintes entradas ao registro do sistema, usando Regedt32.exe.
HKEY_CLASSES_ROOT
Interface
iid
(Default) = ICustomInterfaceName
ProxyStubClsid32 = {clsid}
HKEY_CLASSES_ROOT
CLSID
clsid
(Default) = ICustomInterfaceName_PSFactory
InprocServer32 = proxstub.dll
Tópicos relacionados