IMarshal::GetMarshalSizeMax 메서드(objidl.h)
마샬링하는 동안 필요한 버퍼의 최대 크기를 검색합니다.
구문
HRESULT GetMarshalSizeMax(
[in] REFIID riid,
[in] void *pv,
[in] DWORD dwDestContext,
[in] void *pvDestContext,
[in] DWORD mshlflags,
[out] DWORD *pSize
);
매개 변수
[in] riid
마샬링할 인터페이스의 식별자에 대한 참조입니다.
[in] pv
마샬링할 인터페이스 포인터입니다. 이 매개 변수는 NULL일 수 있습니다.
[in] dwDestContext
지정된 인터페이스를 숨기지 않을 대상 컨텍스트입니다. 가능한 값은 열거형 MSHCTX에서 가져옵니다. 현재 프로세스의 다른 아파트(MSHCTX_INPROC)에서 또는 현재 프로세스(MSHCTX_LOCAL)와 동일한 컴퓨터의 다른 프로세스에서 경계 해제가 발생할 수 있습니다.
[in] pvDestContext
이 매개 변수는 예약되어 있으며 NULL이어야 합니다.
[in] mshlflags
마샬링할 데이터를 클라이언트 프로세스(일반적인 경우)로 다시 전송할지 아니면 여러 클라이언트에서 검색할 수 있는 전역 테이블에 쓸지 여부를 나타냅니다. 가능한 값은 MSHLFLAGS 열거형에서 가져옵니다.
[out] pSize
버퍼의 최대 크기를 받는 변수에 대한 포인터입니다.
반환 값
이 메서드는 다음 값뿐만 아니라 E_FAIL 및 S_OK 표준 반환 값을 반환할 수 있습니다.
반환 코드 | 설명 |
---|---|
|
지정된 인터페이스는 지원되지 않습니다. |
설명
이 메서드는 CoGetMarshalSizeMax 호출에서 서버 프로세스에서 개체의 인터페이스에 대한 포인터를 마샬링하는 모든 코드에 의해 간접적으로 호출됩니다. 이 마샬링 코드는 일반적으로 완전히 다른 개체에 구현된 인터페이스에 대한 포인터를 마샬링할 수 있는 여러 인터페이스 중 하나에 대해 COM에서 생성한 스텁입니다. 예를 들어 IClassFactory 및 IOleItemContainer 인터페이스가 있습니다. 설명을 위해 포인터 마샬링을 담당하는 코드를 마샬링 스텁이라고 합니다.
개체에 대한 프록시를 만들려면 COM에는 원래 개체의 두 가지 정보, 즉 마샬링 스트림에 쓸 데이터 양과 프록시의 CLSID 정보가 필요합니다.
마샬링 스텁은 CoGetMarshalSizeMax 및 CoMarshalInterface에 대한 연속 호출을 통해 이러한 두 가지 정보를 가져옵니다.
발신자에 대한 참고 사항
마샬링 스텁은 CoGetMarshalSizeMax 호출을 통해 이 메서드의 개체 구현을 호출하여 MarshalInterface에 전달될 스트림 버퍼를 미리 할당합니다.기존 COM 인터페이스를 구현하거나 MIDL(Microsoft Interface Definition Language)을 사용하여 사용자 지정 인터페이스를 정의하는 경우 이 메서드를 명시적으로 호출하지 않습니다. 두 경우 모두 MIDL에서 생성된 스텁이 자동으로 호출됩니다.
MIDL을 사용하여 고유한 인터페이스를 정의하지 않는 경우( COM 인터페이스 정의 참조) 마샬링 스텁은 GetMarshalSizeMax를 호출할 필요가 없지만 매우 권장됩니다. 개체는 마샬링 데이터 패킷의 최대 크기가 무엇인지 인터페이스 스텁보다 더 잘 알고 있습니다. 따라서 확장 오버헤드가 미미할 정도로 효율적인 자동으로 증가하는 스트림을 제공하지 않는 한 자체 인터페이스를 구현하는 경우에도 이 메서드를 호출해야 합니다.
이 메서드에서 반환된 값은 마샬링되는 개체의 내부 상태가 변경되지 않는 한 유효합니다. 따라서 이 함수가 반환된 직후에 실제 마샬링이 수행되어야 합니다. 또는 스텁은 상태의 일부 변경으로 인해 원래 표시된 것보다 더 많은 메모리를 마샬링해야 할 수 있는 위험을 실행합니다.
구현자에 대한 참고 사항
MarshalInterface 구현에서는 미리 할당된 버퍼를 사용하여 마샬링 데이터를 스트림에 씁니다. 버퍼가 너무 작으면 마샬링 작업이 실패합니다. 따라서 이 메서드에서 반환되는 값은 인터페이스를 마샬링하는 데 필요한 데이터의 양을 보수적으로 예측해야 합니다. 이 요구 사항의 위반은 치명적인 오류로 처리되어야 합니다.MarshalInterface에 대한 후속 호출에서 IMarshal 구현은 실제로 GetMarshalSizeMax를 호출한 호출자를 미리 사용할 수 없습니다. 스트림에서 반환된 STG_E_MEDIUMFULL 오류를 주의해야 하며 정상적으로 처리할 준비가 되어 있어야 합니다.
나중에 새 대상 컨텍스트가 지원될 때 GetMarshalSizeMax 구현이 계속 제대로 작동하도록 하려면 구현에서 이해하지 못하는 모든 dwDestContext 값에 대해 COM 기본 구현으로 마샬링을 위임합니다. COM 기본 구현에 마샬링을 위임하려면 CoGetStandardMarshal 함수를 호출합니다 .
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 2000 Professional [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows 2000 Server [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | objidl.h |