프록시 DLL 빌드 및 등록

애플리케이션에 대해 프록시/스텁 마샬링을 선택한 경우 MIDL에서 생성한 .c 및 .h 파일을 컴파일하고 연결하여 프록시 DLL을 만들어야 하며 클라이언트가 인터페이스를 찾을 수 있도록 해당 DLL을 시스템 레지스트리에 입력해야 합니다. MIDL에서 생성된 파일 Dlldata.c에는 프록시/스텁 DLL을 빌드하고 등록하는 데 필요한 루틴 및 기타 정보가 포함되어 있습니다.

DLL을 빌드하는 첫 번째 단계는 다음 예제와 같이 링커에 대한 모듈 정의 파일을 작성하는 것입니다.

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

또는 메이크파일의 LINK 명령줄에서 이러한 내보낸 함수를 지정할 수 있습니다.

내보낸 함수는 Dlldata.c에 포함된 Rpcproxy.h에서 선언되며 기본 구현은 RPC 런타임 라이브러리의 일부입니다. COM은 이러한 함수를 사용하여 클래스 팩터리를 만들고, DLL을 언로드하고(개체 또는 잠금이 없는지 확인한 후), 프록시 DLL에 대한 정보를 검색하고, 프록시 DLL을 자체 등록 및 등록 취소합니다. 이러한 미리 정의된 함수를 활용하려면 다음 메이크파일과 같이 Dlldata.c 및 Example_p.c 파일을 컴파일할 때 Cpreprocessor /D(또는 -D) 옵션을 호출해야 합니다.

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
 

컴파일 시간에 이러한 전처리기 정의를 지정하지 않으면 이러한 함수가 자동으로 정의되지 않습니다. 즉, Rpcproxy.c의 매크로는 아무 것도 확장하지 않습니다. C 컴파일러 명령줄의 최종 연결 및 컴파일에도 모듈이 포함되는 다른 소스 파일에서 명시적으로 정의해야 합니다.

REGISTER_PROXY_DLL 정의되면 Rpcproxy.h는 PROXY_CLSID=guid, guid의 PROXY_CLSID_IS=명시적 값 및 ENTRY_PREFIX=접두사 문자열을 사용하여 추가 조건부 컴파일 컨트롤을 제공합니다. 이러한 매크로 정의는 MIDL 프로그래머 가이드의 프록시/스텁에 대한 C-컴파일러 정의 에 자세히 설명되어 있습니다.

프록시 DLL 수동 등록

어떤 이유로 기본 프록시 스텁 등록 루틴을 사용할 수 없는 경우 Regedt32.exe 사용하여 시스템 레지스트리에 다음 항목을 추가하여 DLL을 수동으로 등록할 수 있습니다.

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

프록시/스텁에 대한 C-컴파일러 정의

COM 서버 등록

자체 등록