Compilazione e registrazione di una DLL proxy
Se si è scelto il marshalling proxy/stub per l'applicazione, i file con estensione c e h generati da MIDL devono essere compilati e collegati per creare una DLL proxy e tale DLL deve essere immessa nel Registro di sistema in modo che i client possano individuare le interfacce. Il file generato da MIDL Dlldata.c contiene le routine necessarie e altre informazioni per compilare e registrare una DLL proxy/stub.
Il primo passaggio nella compilazione della DLL consiste nel scrivere un file di definizione del modulo per il linker, come illustrato nell'esempio seguente:
LIBRARY example.dll
DESCRIPTION 'generic proxy/stub DLL'
EXPORTS DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE
In alternativa, è possibile specificare queste funzioni esportate nella riga di comando LINK del makefile.
Le funzioni esportate vengono dichiarate in Rpcproxy.h, che Dlldata.c include e le implementazioni predefinite fanno parte della libreria di runtime RPC. COM usa queste funzioni per creare una class factory, scaricare le DLL (dopo aver verificato che non esistano oggetti o blocchi), recuperare informazioni sulla DLL proxy e registrare automaticamente e annullare la registrazione della DLL proxy. Per sfruttare queste funzioni predefinite, è necessario richiamare l'opzione Cpreprocessor /D (o -D) quando si compilano i file Dlldata.c e Example_p.c, come illustrato nel makefile seguente:
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 non si specificano queste definizioni del preprocessore in fase di compilazione, queste funzioni non vengono definite automaticamente. Ovvero, le macro in Rpcproxy.c si espandono fino a nulla. È necessario definirli in modo esplicito in un altro file di origine, il cui modulo verrebbe incluso anche nel collegamento finale e nella compilazione nella riga di comando del compilatore C.
Quando viene definito REGISTER_PROXY_DLL, Rpcproxy.h fornisce un controllo di compilazione condizionale aggiuntivo con PROXY_CLSID=guid, PROXY_CLSID_IS=valore esplicito di guid e ENTRY_PREFIX=stringa prefisso. Queste definizioni di macro sono descritte in modo più dettagliato nelle definizioni del compilatore C per proxy/stub nella Guida del programmatore MIDL.
Registrazione manuale della DLL proxy
Se per qualche motivo non è possibile usare le routine di registrazione dello stub proxy predefinite, è possibile registrare manualmente la DLL aggiungendo le voci seguenti al Registro di sistema, usando Regedt32.exe.
HKEY_CLASSES_ROOT
Interface
iid
(Default) = ICustomInterfaceName
ProxyStubClsid32 = {clsid}
HKEY_CLASSES_ROOT
CLSID
clsid
(Default) = ICustomInterfaceName_PSFactory
InprocServer32 = proxstub.dll
Argomenti correlati