Erstellen und Registrieren einer Proxy-DLL

Wenn Sie Proxy-/Stub-Marshalling für Ihre Anwendung ausgewählt haben, müssen die VON MIDL generierten C- und H-Dateien kompiliert und verknüpft werden, um eine Proxy-DLL zu erstellen, und diese DLL muss in die Systemregistrierung eingegeben werden, damit Clients Ihre Schnittstellen finden können. Die von MIDL generierte Datei Dlldata.c enthält die erforderlichen Routinen und andere Informationen zum Erstellen und Registrieren einer Proxy-/Stub-DLL.

Der erste Schritt beim Erstellen der DLL besteht darin, eine Moduldefinitionsdatei für den Linker zu schreiben, wie im folgenden Beispiel gezeigt:

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

Alternativ können Sie diese exportierten Funktionen in der LINK-Befehlszeile Ihrer Makefile-Datei angeben.

Die exportierten Funktionen werden in rpcproxy.h deklariert, die Dlldata.c enthält, und Standardimplementierungen sind Teil der RPC-Laufzeitbibliothek. COM verwendet diese Funktionen, um eine Klassenfactory zu erstellen, DLLs zu entladen (nachdem sichergestellt wurde, dass keine Objekte oder Sperren vorhanden sind), Informationen zur Proxy-DLL abzurufen und sich selbst zu registrieren und die Registrierung der Proxy-DLL aufzuheben. Um diese vordefinierten Funktionen nutzen zu können, müssen Sie die Option Cpreprocessor /D (oder -D) aufrufen, wenn Sie die Dateien Dlldata.c und Example_p.c kompilieren, wie in der folgenden makefile gezeigt:

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
 

Wenn Sie diese Präprozessordefinitionen zur Kompilierzeit nicht angeben, werden diese Funktionen nicht automatisch definiert. (Das heißt, die Makros in Rpcproxy.c erweitern nichts.) Sie müssten sie explizit in einer anderen Quelldatei definiert haben, deren Modul auch in der endgültigen Verknüpfung und Kompilierung in der Befehlszeile des C-Compilers enthalten wäre.

Wenn REGISTER_PROXY_DLL definiert ist, bietet Rpcproxy.h zusätzliche bedingte Kompilierungssteuerelemente mit PROXY_CLSID=guid, PROXY_CLSID_IS=explicit-Wert von guid und ENTRY_PREFIX=präfixzeichenfolge. Diese Makrodefinitionen werden ausführlicher unter C-Compilerdefinitionen für Proxy/Stubs im MIDL-Programmierhandbuch beschrieben.

Manuelles Registrieren der Proxy-DLL

Wenn Sie aus irgendeinem Grund die standardmäßigen Proxy-Stubregistrierungsroutinen nicht verwenden können, können Sie die DLL manuell registrieren, indem Sie der Systemregistrierung die folgenden Einträge hinzufügen, indem Sie Regedt32.exe verwenden.

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

C-Compilerdefinitionen für Proxy/Stubs

Registrieren von COM-Servern

Selbstregistrierung