다음을 통해 공유


CoCreateFreeThreadedMarshaler 함수(combaseapi.h)

컨텍스트 종속 마샬링이 가능한 집계 가능한 개체를 만듭니다.

구문

HRESULT CoCreateFreeThreadedMarshaler(
  [in]  LPUNKNOWN punkOuter,
  [out] LPUNKNOWN *ppunkMarshal
);

매개 변수

[in] punkOuter

집계 개체의 제어 IUnknown에 대한 포인터입니다.

[out] ppunkMarshal

집계 가능한 마샬러에 대한 인터페이스 포인터를 수신하는 포인터 변수의 주소입니다.

반환 값

이 함수는 E_OUTOFMEMORY 표준 반환 값과 다음 값을 반환할 수 있습니다.

반환 코드 Description
S_OK
마샬러가 만들어졌습니다.

설명

CoCreateFreeThreadedMarshaler 함수를 사용하면 개체가 동일한 프로세스의 스레드 간에 인터페이스 포인터를 효율적으로 마샬링할 수 있습니다. 개체가 스레드 간 마샬링을 지원하지 않는 경우 이 함수를 호출할 필요가 없습니다. 단일 스레드 아파트와 연결된 스레드조차도 프로세스의 모든 스레드에서 직접 액세스해야 하는 자유 스레드 DLL 서버에서 사용하기 위한 것입니다. 실제 메모리 포인터를 가짜 "프록시"로 다른 아파트로 사용자 지정 마샬링하여 무료 스레드가 아니더라도 모든 발신자에게 직접 액세스할 수 있습니다.

CoCreateFreeThreadedMarshaler 함수는 다음 작업을 수행합니다.

  1. 자유 스레드 마샬러 개체를 만듭니다.
  2. 이 마샬러를 punkOuter 매개 변수로 지정된 개체에 집계합니다. 이 개체는 일반적으로 인터페이스 포인터를 마샬링해야 하는 개체입니다.
집계 개체의 IMarshal 구현은 IID_IMarshal 대한 QueryInterface 호출을 자유 스레드 마샬러의 IUnknown 에 위임해야 합니다. 호출을 받으면 자유 스레드 마샬러는 다음 작업을 수행합니다.
  1. CoMarshalInterface 함수의 dwDestContext 매개 변수로 지정된 대상 컨텍스트를 확인합니다.
  2. 대상 컨텍스트가 MSHCTX_INPROC 경우 인터페이스 포인터를 마샬링 스트림에 복사합니다.
  3. 대상 컨텍스트가 다른 값인 경우 COM의 기본(표준) 마샬러 instance 찾거나 만들고 마샬링을 위임합니다.
dwDestContext의 값은 MSHCTX 열거형에서 가져옵니다. MSHCTX_INPROC 인터페이스 포인터가 동일한 프로세스의 서로 다른 스레드 간에 마샬링되어야 했음을 나타냅니다. 두 스레드 모두 동일한 주소 공간에 액세스할 수 있으므로 클라이언트 스레드는 프록시에 대한 호출을 직접 호출하지 않고 포인터를 직접 역참조할 수 있습니다. 다른 모든 경우에는 프록시가 필요하므로 CoCreateFreeThreadedMarshaler 는 마샬링 작업을 COM의 기본 구현으로 위임합니다.

CoCreateFreeThreadedMarshaler 함수를 사용할 때는 주의해야 합니다. 이는 자유 스레드 마샬러를 집계하는 개체의 성능이 COM 규칙의 계산된 위반을 통해 얻을 수 있기 때문이며, 개체가 특정 제한 내에서 작동하지 않는 한 정의되지 않은 동작의 위험이 항상 존재하기 때문입니다. 가장 중요한 제한 사항은 다음과 같습니다.

  • 자유 스레드 마샬러 개체는 자유 스레드 마샬러를 상태의 일부로 집계하지 않는 개체의 인터페이스에 대한 직접 포인터를 보유할 수 없습니다. 개체가 일반 단일 스레드 집계 개체에 대한 직접 참조를 사용하는 경우 단일 스레드 속성이 끊어질 수 있습니다. 개체가 일반 다중 스레드 집계 개체에 대한 직접 참조를 사용하는 경우 이러한 개체는 직접 단일 스레드 집계 클라이언트의 요구에 민감도를 표시하지 않는 방식으로 동작할 수 있습니다. 예를 들어 이러한 개체는 새 스레드를 회전하고 매개 변수를 일반 단일 스레드 집계 개체에 대한 참조인 스레드에 전달할 수 있습니다.
  • 자유 스레드 마샬러 개체는 다른 아파트의 개체에 대한 프록시에 대한 참조를 보유할 수 없습니다. 프록시는 스레딩 모델에 민감하며 잘못된 클라이언트에서 호출되는 경우 RPC_E_WRONG_THREAD 반환할 수 있습니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows 2000 Server [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 combaseapi.h(Objbase.h 포함)
라이브러리 Ole32.lib
DLL Ole32.dll

추가 정보

CoGetInterfaceAndReleaseStream

CoMarshalInterThreadInterfaceInStream