Share via


IMarshal::GetUnmarshalClass 메서드(objidl.h)

unmarshaling 코드의 CLSID를 검색합니다.

구문

HRESULT GetUnmarshalClass(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] CLSID  *pCid
);

매개 변수

[in] riid

마샬링할 인터페이스의 식별자에 대한 참조입니다.

[in] pv

마샬링할 인터페이스에 대한 포인터입니다. 호출자에게 원하는 인터페이스에 대한 포인터가 없는 경우 는 NULL 일 수 있습니다.

[in] dwDestContext

지정된 인터페이스를 숨기지 않을 대상 컨텍스트입니다. 가능한 값은 열거형 MSHCTX에서 가져옵니다. 언마샬링은 현재 프로세스(MSHCTX_INPROC)의 다른 아파트 또는 현재 프로세스(MSHCTX_LOCAL)와 동일한 컴퓨터의 다른 프로세스에서 발생할 수 있습니다.

[in] pvDestContext

이 매개 변수는 예약되어 있으며 NULL이어야 합니다.

[in] mshlflags

마샬링할 데이터를 클라이언트 프로세스(일반적인 경우)로 다시 전송할지 아니면 여러 클라이언트에서 검색할 수 있는 전역 테이블에 쓸 것인지를 나타냅니다. 가능한 값은 MSHLFLAGS 열거형에서 가져옵니다.

[out] pCid

클라이언트 프로세스에서 프록시를 만드는 데 사용할 CLSID를 수신하는 포인터입니다.

반환 값

메서드가 성공하면 반환 값이 S_OK. 그렇지 않으면 S_FALSE.

설명

이 메서드는 서버 프로세스에서 개체의 인터페이스에 대한 포인터를 마샬링하는 모든 코드에 의해 CoMarshalInterface 호출에서 간접적으로 호출됩니다. 이 마샬링 코드는 일반적으로 완전히 다른 개체에 구현된 인터페이스에 대한 포인터를 마샬링할 수 있는 여러 인터페이스 중 하나에 대해 COM에서 생성한 스텁입니다. 예를 들어 IClassFactoryIOleItemContainer 인터페이스가 있습니다. 설명을 위해 포인터 마샬링을 담당하는 코드를 마샬링 스텁이라고 합니다.

개체에 대한 프록시를 만들려면 COM에는 원래 개체의 두 가지 정보, 즉 마샬링 스트림에 쓸 데이터 양과 프록시의 CLSID가 필요합니다.

마샬링 스텁은 CoGetMarshalSizeMaxCoMarshalInterface에 대한 연속 호출을 통해 이러한 두 가지 정보를 가져옵니다.

발신자에게 참고 사항

마샬링 스텁은 이 메서드의 개체 구현을 호출하여 프록시의 instance 만드는 데 사용할 CLSID를 가져옵니다. 클라이언트는 CLSID를 받으면 시스템 레지스트리에 나열된 DLL을 로드합니다.

기존 COM 인터페이스를 구현하거나 MIDL(Microsoft Interface Definition Language)을 사용하여 사용자 고유의 인터페이스를 정의하는 경우 이 메서드를 명시적으로 호출하지 않습니다. 두 경우 모두 스텁이 자동으로 호출합니다. COM 인터페이스 정의를 참조하세요.

MIDL을 사용하여 고유한 인터페이스를 정의하지 않는 경우 클라이언트 쪽 COM 라이브러리가 인터페이스를 구현하는 개체에 대한 프록시를 만드는 데 필요한 CLSID를 가져오기 위해 스텁이 직접 또는 간접적으로 이 메서드를 호출해야 합니다.

호출자에게 마샬링할 인터페이스에 대한 포인터가 있는 경우 효율성상 pv 매개 변수를 사용하여 해당 포인터를 전달해야 합니다. 이러한 방식으로 이러한 포인터를 사용하여 프록시에 대한 적절한 CLSID를 확인할 수 있는 구현은 QueryInterface 자체를 호출할 필요가 없습니다. 호출자에게 마샬링할 인터페이스에 대한 포인터가 없는 경우 NULL을 전달할 수 있습니다.

구현자에 대한 참고 사항

COM 은 GetUnmarshalClass 를 호출하여 클라이언트 프로세스에서 프록시를 만드는 데 사용할 CLSID를 가져옵니다. 프록시에 사용할 CLSID는 일반적으로 원래 개체가 아니라 프록시 개체에 대해 특별히 생성한 것(Guidgen.exe 도구 사용)입니다.

하나 이상의 인터페이스에 대한 마샬링을 제공하는 각 개체에 대해 이 메서드를 구현합니다. 개체 마샬링을 담당하는 코드는 마샬링 데이터와 함께 CLSID를 스트림에 씁니다. COM은 수신 쪽의 스트림에서 CLSID 및 데이터를 추출합니다.

프록시 구현이 단순히 전체 원래 개체를 클라이언트 프로세스에 복사하여 원래 개체에 대한 호출을 전달할 필요가 없도록 구성되는 경우 반환된 CLSID는 원래 개체와 동일합니다. 물론 이 전략은 변경되지 않을 것으로 예상되는 개체에 대해서만 권장됩니다.

pv 매개 변수가 NULL이고 구현에 인터페이스 포인터가 필요한 경우 현재 개체에서 QueryInterface를 호출하여 가져올 수 있습니다. pv 매개 변수는 단순히 효율성을 개선하기 위해 존재합니다.

나중에 새 대상 컨텍스트가 지원될 때 GetUnmarshalClass 구현이 계속 제대로 작동하도록 하려면 구현에서 처리하지 않는 모든 dwDestContext 값에 대해 COM 기본 구현으로 마샬링을 위임합니다. COM 기본 구현에 마샬링을 위임하려면 CoGetStandardMarshal 함수를 호출합니다 .

참고ThreadingModel 레지스트리 값은 GetUnmarshalClass 메서드에서 반환된 CLSID를 구현하는 In Process 서버의 경우 모두여야 합니다. 자세한 내용은 InprocServer32를 참조하세요.
 

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows 2000 Server [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 objidl.h

추가 정보

CoMarshalInterface

IMarshal