Génération et inscription d’une DLL proxy

Si vous avez choisi le marshaling proxy/stub pour votre application, les fichiers .c et .h générés par MIDL doivent être compilés et liés pour créer une DLL proxy, et cette DLL doit être entrée dans le registre système afin que les clients puissent localiser vos interfaces. Le fichier DLLdata.c généré par MIDL contient les routines et autres informations nécessaires pour générer et inscrire une DLL proxy/stub.

La première étape de la création de la DLL consiste à écrire un fichier de définition de module pour l’éditeur de liens, comme illustré dans l’exemple suivant :

LIBRARY        example.dll
DESCRIPTION    'generic proxy/stub DLL'
EXPORTS        DllGetClassObject      @1 PRIVATE
               DllCanUnloadNow        @2 PRIVATE
               DllRegisterServer      @4 PRIVATE
               DllUnregisterServer    @5 PRIVATE
 

Vous pouvez également spécifier ces fonctions exportées sur la ligne de commande LINK de votre makefile.

Les fonctions exportées sont déclarées dans Rpcproxy.h, que Dlldata.c inclut, et les implémentations par défaut font partie de la bibliothèque d’exécution RPC. COM utilise ces fonctions pour créer une fabrique de classes, décharger les DLL (après s’être assuré qu’aucun objet ou verrou n’existe), récupérer des informations sur la DLL proxy et pour inscrire et annuler l’inscription automatique de la DLL proxy. Pour tirer parti de ces fonctions prédéfinies, vous devez appeler l’option Cpreprocessor /D (ou -D) lorsque vous compilez les fichiers Dlldata.c et Example_p.c, comme indiqué dans le makefile suivant :

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
 

Si vous ne spécifiez pas ces définitions de préprocesseur au moment de la compilation, ces fonctions ne sont pas définies automatiquement. (Autrement dit, les macros dans Rpcproxy.c ne sont pas étendues.) Vous auriez dû les définir explicitement dans un autre fichier source, dont le module serait également inclus dans la liaison finale et la compilation sur la ligne de commande du compilateur C.

Lorsque REGISTER_PROXY_DLL est défini, Rpcproxy.h fournit un contrôle de compilation conditionnel supplémentaire avec PROXY_CLSID=guid, PROXY_CLSID_IS=valeur explicite de guid et ENTRY_PREFIX=chaîne de préfixe. Ces définitions de macro sont décrites plus en détail dans Définitions du compilateur C pour les proxys/stubs dans le Guide du programmeur MIDL.

Inscription manuelle de la DLL proxy

Si, pour une raison quelconque, vous ne pouvez pas utiliser les routines d’inscription de stub de proxy par défaut, vous pouvez inscrire manuellement la DLL en ajoutant les entrées suivantes au registre système, à l’aide de Regedt32.exe.

HKEY_CLASSES_ROOT
   Interface
      iid
         (Default) = ICustomInterfaceName
         ProxyStubClsid32 = {clsid}
HKEY_CLASSES_ROOT
   CLSID
      clsid
         (Default) = ICustomInterfaceName_PSFactory
         InprocServer32 = proxstub.dll

Définitions du compilateur C pour proxy/stubs

Inscription de serveurs COM

Inscription automatique