IMessageFilter::MessagePending 메서드(objidl.h)

COM이 원격 호출에 응답하기 위해 대기하는 동안 메시지가 도착했음을 나타냅니다.

나가는 호출이 완료 될 때까지 기다리는 동안 입력을 처리하면 복잡성이 발생할 수 있습니다. 애플리케이션은 호출을 중단하지 않고 메시지를 처리할지, 계속 대기할지 또는 작업을 취소할지를 결정해야 합니다.

구문

DWORD MessagePending(
  [in] HTASK htaskCallee,
  [in] DWORD dwTickCount,
  [in] DWORD dwPendingType
);

매개 변수

[in] htaskCallee

호출된 애플리케이션의 스레드 ID입니다.

[in] dwTickCount

호출 이후의 틱 수입니다. GetTickCount 함수에서 계산됩니다.

[in] dwPendingType

메시지 또는 이벤트를 수신하는 동안 수행한 호출 유형입니다. 가능한 값은 열거형 PENDINGTYPE에서 가져옵니다. 여기서 PENDINGTYPE_TOPLEVEL 나가는 호출이 다른 애플리케이션의 호출 내에 중첩되지 않았으며 PENDINTGYPE_NESTED 나가는 호출이 다른 애플리케이션의 호출 내에 중첩되었음을 의미합니다.

반환 값

이 메서드는 다음 값을 반환할 수 있습니다.

반환 코드 설명
PENDINGMSG_CANCELCALL
나가는 호출을 취소합니다. 극한 조건에서만 반환해야 합니다. 회신하지 않았거나 거부되지 않은 호출을 취소하면 고아 트랜잭션이 생성되고 리소스가 손실될 수 있습니다. COM은 원래 호출에 실패하고 RPC_E_CALL_CANCELLED 반환합니다.
PENDINGMSG_WAITNOPROCESS
사용되지 않습니다.
PENDINGMSG_WAITDEFPROCESS
키보드 및 마우스 메시지는 더 이상 디스패치되지 않습니다. 그러나 마우스 및 키보드 메시지로 인해 시스템이 교착 상태에 빠질 수 있고 이러한 경우 마우스 및 키보드 메시지가 삭제되는 경우도 있습니다. WM_PAINT 메시지가 디스패치됩니다. 작업 전환 및 활성화 메시지는 이전과 같이 처리됩니다.

설명

COM은 애플리케이션이 COM 메서드를 호출하고 호출이 반환되기 전에 Windows 메시지가 발생한 후 MessagePending 을 호출합니다. 예를 들어 사용자가 메뉴 명령을 선택하거나 개체를 두 번 클릭하면 Windows 메시지가 전송됩니다. COM이 MessagePending 을 호출하기 전에 원래 COM 메서드 호출 이후 경과된 시간을 계산합니다. COM은 dwTickCount 매개 변수에서 경과된 시간을 제공합니다. 그 동안 COM은 큐에서 메시지를 제거하지 않습니다.

호출자의 큐에 표시되는 Windows 메시지는 메시지가 미리 입력한 결과가 아니라 주의를 끌기 위한 시도인지 확인하기 위해 충분한 시간이 경과할 때까지 큐에 남아 있어야 합니다. dwTickCount 매개 변수를 사용하여 지연을 설정합니다. 2초 또는 3초 지연이 권장됩니다. 해당 시간이 지났고 호출이 완료되지 않은 경우 호출자는 큐에서 메시지를 플러시해야 하며 OLE UI 사용 중 대화 상자가 표시되어 사용자에게 통화를 다시 시도(계속 대기)하거나 지정된 작업으로 전환할 수 있습니다. 이렇게 하면 다음과 같은 동작이 수행됩니다.

  • 적절한 시간 내에 호출이 완료되면 미리 입력이 올바르게 처리됩니다.
  • 호출 수신자가 응답하지 않으면 미리 입력이 잘못 해석되지 않고 사용자가 문제를 해결하기 위해 작업할 수 있습니다. 예를 들어 OLE 1 서버는 모달 대화 상자에 있을 때 응답하지 않고 요청을 큐에 대기할 수 있습니다.
나가는 호출이 완료 될 때까지 기다리는 동안 입력을 처리하면 복잡성이 발생할 수 있습니다. 애플리케이션은 호출을 중단하지 않고 메시지를 처리할지, 계속 대기할지 또는 작업을 취소할지를 결정해야 합니다.

원래 COM 호출에 대한 응답이 없는 경우 애플리케이션은 해당 스토리지에서 IStorage::Revert 를 호출하여 호출을 취소하고 COM 개체를 일관된 상태로 복원할 수 있습니다. 컨테이너를 종료할 수 있는 경우 개체를 해제할 수 있습니다. 그러나 호출을 취소하면 분리된 작업 및 리소스 누수를 만들 수 있습니다. 취소는 최후의 수단으로만 사용해야 합니다. 애플리케이션에서 이러한 호출을 취소할 수 없도록 하는 것이 좋습니다.

참고htaskCallee 매개 변수는 HTASK로 형식화되지만 호출된 스레드의 스레드 ID를 포함합니다. IMessageFilter 인터페이스를 구현할 때 OpenThread 함수를 호출하여 htaskCallee 매개 변수에서 스레드 핸들을 가져오고 GetProcessIdOfThread 함수를 호출하여 프로세스 ID를 가져올 수 있습니다.
 

요구 사항

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

추가 정보

IMessageFilter

OleUIBusy