다음을 통해 공유


CoReleaseMarshalData 함수(combaseapi.h)

이전에 마샬링된 데이터 패킷을 삭제합니다.

구문

HRESULT CoReleaseMarshalData(
  [in] LPSTREAM pStm
);

매개 변수

[in] pStm

삭제할 데이터 패킷을 포함하는 스트림에 대한 포인터입니다. IStream을 참조하세요.

반환 값

이 함수는 다음 값뿐만 아니라 표준 반환 값 E_FAIL, E_INVALIDARG, E_OUTOFMEMORY 및 E_UNEXPECTED 반환할 수 있습니다.

반환 코드 Description
S_OK
데이터 패킷이 성공적으로 제거되었습니다.
STG_E_INVALIDPOINTER
pStm 매개 변수와 관련된 오류입니다.
CO_E_NOTINITIALIZED
이 함수가 호출되기 전에 현재 스레드에서 CoInitialize 또는 OleInitialize 함수가 호출되지 않았습니다.

설명

중요  

보안 참고: 신뢰할 수 없는 데이터로 이 메서드를 호출하는 것은 보안 위험입니다. 신뢰할 수 있는 데이터로만 이 메서드를 호출하세요.

 
CoReleaseMarshalData 함수는 다음 작업을 수행합니다.
  1. 함수는 스트림에서 CLSID를 읽습니다.
  2. COM의 기본 마샬링 구현을 사용하는 경우 함수는 표준 unmarshaler의 instance 대한 IMarshal 포인터를 가져옵니다. 사용자 지정 마샬링을 사용하는 경우 함수는 CoCreateInstance 함수를 호출하고 스트림에서 읽은 CLSID를 전달하여 프록시를 만들고 새로 만든 프록시에 대한 IMarshal 인터페이스 포인터를 요청합니다.
  3. 함수는 가져온 IMarshal 인터페이스 포인터를 사용하여 IMarshal::ReleaseMarshalData를 호출합니다.
일반적으로 이 함수를 호출하지 않습니다. 이 함수를 호출해야 하는 유일한 상황은 사용자 지정 마샬링을 사용하는 경우입니다( IMarshal의 고유한 구현을 작성하고 사용). CoReleaseMarshalData를 호출해야 하는 경우의 예는 다음과 같습니다.
  • 데이터 패킷을 숨기려고 했지만 실패했습니다.
  • 마샬링된 데이터 패킷이 전역 테이블에서 제거되었습니다.
비유로 데이터 패킷은 개체에 보관되는 다른 인터페이스 포인터인 것처럼 원래 개체에 대한 참조로 간주할 수 있습니다. 실제 인터페이스 포인터와 마찬가지로 해당 데이터 패킷은 어느 시점에서 해제되어야 합니다. IMarshal::ReleaseMarshalData를 사용하여 데이터 패킷을 해제하는 것은 IUnknown::Release를 사용하여 인터페이스 포인터를 해제하는 것과 유사합니다.

CoUnmarshalInterface 함수를 성공적으로 호출한 후에는 CoReleaseMarshalData를 호출할 필요가 없습니다. 해당 함수는 마샬링 데이터를 처리의 일부로 해제합니다.

중요CoMarshalInterface를 호출한 동일한 아파트에서 CoReleaseMarshalData 함수를 호출하여 개체를 스트림으로 마샬링해야 합니다. 이렇게 하지 않으면 스트림에서 마샬링된 패킷이 보유한 개체 참조가 유출될 수 있습니다.
 

요구 사항

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

추가 정보

IMarshal::ReleaseMarshalData