Condividi tramite


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

Definizioni del compilatore C per proxy/stub

Registrazione di server COM

Registrazione automatica