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
Rubriques connexes