IMoniker::BindToObject 메서드(objidl.h)

지정된 개체에 바인딩합니다. 바인딩 프로세스에는 개체를 찾고, 필요한 경우 실행 상태로 전환하고, 호출자에게 식별된 개체의 지정된 인터페이스에 대한 포인터를 제공하는 작업이 포함됩니다.

구문

HRESULT BindToObject(
  [in]  IBindCtx *pbc,
  [in]  IMoniker *pmkToLeft,
  [in]  REFIID   riidResult,
  [out] void     **ppvResult
);

매개 변수

[in] pbc

이 바인딩 작업에 사용되는 바인딩 컨텍스트 개체의 IBindCtx 인터페이스에 대한 포인터입니다. 바인딩 컨텍스트는 바인딩 프로세스 중에 바인딩된 개체를 캐시하고, 바인딩 컨텍스트를 사용하여 모든 작업에 적용되는 매개 변수를 포함하며, 모니커 구현이 해당 환경에 대한 정보를 검색해야 하는 수단을 제공합니다.

[in] pmkToLeft

모니커가 복합 모니커의 일부인 경우 이 모니커의 왼쪽에 있는 모니커를 가리키는 포인터입니다. 이 매개 변수는 주로 모니커 구현자가 복합 모니커의 다양한 구성 요소 간의 협력을 가능하게 하는 데 사용됩니다. 모니커 클라이언트는 NULL을 사용해야 합니다.

[in] riidResult

클라이언트가 모니커가 식별하는 개체와 통신하는 데 사용하려는 인터페이스의 IID입니다.

[out] ppvResult

riid에서 요청된 인터페이스 포인터를 수신하는 포인터 변수의 주소입니다. 반환에 성공하면 *ppvResult 에는 모니커가 식별하는 개체에 대한 요청된 인터페이스 포인터가 포함됩니다. 성공하면 구현은 모니커에서 AddRef 를 호출해야 합니다. 릴리스를 호출하는 것은 호출자의 책임입니다. 오류가 발생하면 *ppvResultNULL이어야 합니다.

반환 값

이 메서드는 다음 값뿐만 아니라 E_OUTOFMEMORY 및 E_UNEXPECTED 표준 반환 값을 반환할 수 있습니다.

반환 코드 Description
S_OK
바인딩 작업이 성공했습니다.
MK_E_NOOBJECT
이 모니커로 식별된 개체 또는 이 모니커가 일부인 복합 모니커로 식별된 일부 개체를 찾을 수 없습니다.
MK_E_EXCEEDEDDEADLINE
바인딩 컨텍스트의 BIND_OPTS 구조에 지정된 시간 제한 내에서 바인딩 작업을 완료할 수 없습니다.
MK_E_CONNECTMANUALLY
바인딩 작업에는 최종 사용자의 지원이 필요합니다. 이 값을 반환하는 가장 일반적인 이유는 암호가 필요하거나 플로피를 탑재해야 하기 때문입니다. 이 값이 반환되면 "ConnectManually" 키를 사용하여 IBindCtx::GetObjectParam 을 호출하여 오류를 발생시킨 모니커를 검색합니다. 그런 다음 IMoniker::GetDisplayName 을 호출하여 표시 이름을 가져와서 플로피 또는 암호 요청을 탑재하는 지침과 같은 원하는 정보를 전달하는 대화 상자를 표시한 다음 바인딩 작업을 다시 시도할 수 있습니다.
MK_E_INTERMEDIATEINTERFACENOTSUPPORTED
중간 개체를 찾았지만 바인딩 작업을 완료하는 데 필요한 인터페이스를 지원하지 않았습니다. 예를 들어 항목 모니커는 컨테이너가 IOleItemContainer 인터페이스를 지원하지 않는 경우 이 값을 반환합니다.
STG_E_ACCESSDENIED
스토리지 개체에 액세스할 수 없습니다.
 

이 메서드는 IOleItemContainer::GetObject 메서드와 연결된 오류를 반환할 수도 있습니다.

설명

BindToObject 는 모니커로 식별된 개체를 찾고 해당 인터페이스 중 하나에 대한 포인터를 반환하는 모니커의 기본 함수를 구현합니다.

발신자에 대한 참고 사항

모니커를 두 개체 간의 영구 연결로 사용하는 경우 BindToObject를 호출하여 연결을 활성화합니다.

일반적으로 다음 프로세스 중에 BindToObject 를 호출합니다.

  1. CreateBindCtx 함수를 호출하여 바인딩 컨텍스트 개체를 만듭니다.
  2. 모니커를 사용하여 BindToObject 를 호출하고 식별된 개체에서 원하는 인터페이스에 대한 포인터를 검색합니다.
  3. 바인딩 컨텍스트를 해제합니다.
  4. 획득한 인터페이스 포인터를 통해 개체에 대해 원하는 작업을 수행합니다.
  5. 개체를 완료하면 개체의 인터페이스 포인터를 놓습니다.
다음 코드 조각에서는 이러한 단계를 보여 줍니다.
HRESULT hr;       // An error code
IMoniker * pMnk;  // A previously acquired interface moniker

// Obtain an IBindCtx interface.
IBindCtx * pbc; 
hr = CreateBindCtx(NULL, &pbc); 
if (FAILED(hr)) exit(0);  // Handle errors here. 
   
// Obtain an implementation of pCellRange. 
ICellRange * pCellRange; 
hr = pMnk->BindToObject(pbc, NULL, IID_ICellRange, &pCellRange); 
if (FAILED(hr)) exit(0);  // Handle errors here. 

// Use pCellRange here. 

// Release interfaces after use. 
pbc->Release(); 
pCellRange->Release(); 

바인딩 작업을 하나만 사용하고 바인딩 컨텍스트 개체를 유지할 필요가 없는 경우에도 BindMoniker 함수를 사용할 수 있습니다. 이 도우미 함수는 BindToObject 를 호출하고 바인딩 컨텍스트를 해제하는 바인딩 컨텍스트 만들기를 캡슐화합니다.

개체에 대한 링크를 지원하는 COM 컨테이너는 모니커를 사용하여 연결된 개체를 찾고 액세스할 수 있지만 일반적으로 BindToObject 를 직접 호출하지는 않습니다. 대신 사용자가 컨테이너에서 링크를 활성화하면 링크 컨테이너는 일반적으로 링크 처리기의 구현을 사용하여 IOleObject::D oVerb을 호출합니다. 이 구현은 연결된 개체에 저장된 모니커에서 BindToObject 를 호출합니다(동사를 처리할 수 없는 경우).

구현자에 대한 참고 사항

구현은 모니커에 접두사를 포함할지 여부에 따라 달라집니다. 즉, pmkToLeft 매개 변수가 NULL 인지 여부입니다. 예를 들어 컨테이너 내의 개체를 식별하는 항목 모니커에는 pmkToLeft 가 컨테이너를 식별해야 합니다. 따라서 항목 모니커는 pmkToLeft 를 사용하여 해당 컨테이너에서 서비스를 요청합니다. 모니커에 접두사가 있어야 하는 경우 pmkToLeft 매개 변수(예: BindToObject 호출)를 사용하여 식별되는 개체에서 서비스를 요청해야 합니다.

모니커에 접두사가 없는 경우 BindToObject 구현은 먼저 ROT(실행 중인 개체 테이블)를 검사 개체가 이미 실행 중인지 확인해야 합니다. ROT에 대한 포인터를 가져오려면 구현에서 pbc 매개 변수에서 IBindCtx::GetRunningObjectTable을 호출해야 합니다. 그런 다음 IRunningObjectTable::GetObject 메서드를 호출하여 현재 모니커가 ROT에 등록되었는지 확인할 수 있습니다. 이 경우 QueryInterface 를 즉시 호출하여 호출자가 요청한 인터페이스에 대한 포인터를 가져올 수 있습니다.

BindToObject 구현이 일부 개체에 바인딩되면 pbc 매개 변수를 사용하여 IBindCtx::RegisterObjectBound를 호출하여 바인딩된 개체에 대한 참조를 바인딩 컨텍스트에 저장해야 합니다. 이렇게 하면 바인딩 컨텍스트가 해제될 때까지 바인딩된 개체가 계속 실행되므로 나중에 바인딩 작업을 다시 로드하지 않아도 됩니다.

바인딩 컨텍스트의 BIND_OPTS 구조가 BINDFLAGS_JUSTTESTEXISTENCE 플래그를 지정하는 경우 구현에는 ppvResult에서 NULL을 반환하는 옵션이 있습니다(플래그를 무시하고 전체 바인딩 작업을 수행할 수도 있음).

구현별 참고 사항

구현 참고
안티 모니커 이 메서드가 구현되지 않은 경우 E_NOTIMPL 반환합니다.
클래스 모니커 pmkLeftNULL인 경우 클래스 모니커가 (CreateClassMoniker 또는 MkParseDisplayName을 통해) 및 현재 pbc(IBindCtx)의 CLSCTX를 사용하여 초기화된 CLSID를 사용하여 CoGetClassObject를 호출합니다.

pmkLeftNULL이 아닌 경우 iClassActivator에 대해 pmkLeft-BindToObject>를 호출하고 초기화된 CLSID와 현재 pbc(IBindCtx)의 CLSCTX 및 로캘 매개 변수를 사용하여 IClassActivator::GetClassObject를 호출합니다.

파일 모니커 pmkToLeftNULL이면 메서드는 ROT에서 모니커를 찾고 검색된 개체에서 요청된 인터페이스 포인터를 쿼리합니다. ROT에서 모니커를 찾을 수 없는 경우 메서드는 파일 시스템에서 개체를 로드하고 요청된 인터페이스 포인터를 검색합니다.

pmkLeftNULL이 아닌 경우 GetClassFile(또는 기타 수단)을 사용하여 파일 모니커가 참조하는 파일의 내용을 사용하여 인스턴스화하고 초기화할 클래스를 결정하는 대신 iClassFactoryIClassActivator용 pmkLeft-BindToObject>를 호출하여 pcf에서 이 포인터를 검색합니다. E_NOINTERFACE 실패하면 MK_E_INTERMEDIATEINTERFACENOTSUPPORTED 반환합니다.

IClassFactory 포인터가 성공적으로 검색되면 pcf-CreateInstance>(IID_IPersistFile, (void**)&ppf)를 호출하여 IPersistFile 또는 파일 모니커의 기존 초기화 경로에 따라 클래스를 초기화하고 초기화할 클래스의 새 instance 가져옵니다.

제네릭 복합 모니커 pmkToLeftNULL인 경우 이 메서드는 ROT에서 모니커를 찾은 다음 검색된 개체에서 요청된 인터페이스 포인터를 쿼리합니다. pmkToLeftNULL이 아닌 경우 메서드는 복합의 가장 오른쪽 구성 요소에서 BindToObject를 재귀적으로 호출하여 나머지 복합을 해당 호출에 대한 pmkToLeft 매개 변수로 전달합니다.
항목 모니커 pmkToLeftNULL이면 이 메서드는 E_INVALIDARG 반환합니다. 그렇지 않으면 메서드는 pmkToLeft 매개 변수에서 BindToObject를 호출하고 IOleItemContainer 인터페이스 포인터를 요청합니다. 그런 다음 메서드는 IOleItemContainer::GetObject를 호출하여 모니커 내에 포함된 문자열을 전달하고 요청된 인터페이스 포인터를 반환합니다.
OBJREF 모니커 pmkToLeft 매개 변수는 NULL이어야 합니다. OBJREF 모니커는 실행 중인 개체를 나타내므로 활성화가 발생하지 않습니다. 표시된 개체가 더 이상 실행되고 있지 않으면 BindToObject 가 E_UNEXPECTED 실패합니다.
포인터 모니커 이 메서드는 요청된 인터페이스에 대해 래핑된 포인터를 쿼리합니다.
URL 모니커 URL Moniker는 비동기 바인딩을 지원하므로 BindToObject 의 실제 반환 값은 바인딩 컨텍스트에 설정된 개체 매개 변수에 따라 달라질 수 있습니다. 자세한 내용은 아래를 참조하세요.
 

URL 모니커에 대한 바인딩 작업의 의미 체계는 동기 또는 비동기 사용에 관계없이 동일하며 다음과 같습니다.

  1. URL 모니커는 바인딩 컨텍스트에서 바인딩 작업에 대한 추가 정보를 가져옵니다. 예를 들어 모니커는 바인딩 컨텍스트에 등록된 IBindStatusCallbackIEnumFORMATETC 인터페이스에 대한 포인터를 가져올 수 있습니다. 추가 정보에는 iBindCtx::SetBindOptions를 통해 바인딩 컨텍스트에 지정된 추가 바인딩 옵션(예: dwTickCountDeadline 매개 변수 또는 BIND_MAYBOTHERUSER grfFlags 값)이 포함될 수 있습니다.
  2. 다음으로 모니커는 바인딩 컨텍스트의 ROT를 확인하여 참조된 개체가 이미 실행 중인지 확인합니다. 모니커는 다음 호출을 사용하여 이 정보를 가져올 수 있습니다.
    IBindCtx::GetRunningObjectTable(&prot)
    prot->IsRunning(this)
    
    
  3. 개체가 이미 실행 중인 경우 모니커는 다음 호출을 사용하여 실행 중인 개체를 검색합니다.
    prot->GetObject(this, &punk)
    
    
  4. 그런 다음 모니커는 요청된 인터페이스에 대해 QueryInterface 를 호출합니다.
  5. 그렇지 않으면 모니커가 IBindStatusCallback::GetBindInfo 를 호출하여 클라이언트를 쿼리하여 추가 바인딩 정보를 가져옵니다. 그런 다음 모니커는 바인딩 작업을 시작하고 IBindStatusCallback::OnStartBinding을 호출하여 결과 IBinding 인터페이스를 클라이언트에 다시 전달합니다.
  6. 1단계에서 비동기 바인딩이라고 판단되면 BindToObject 는 이 시점에서 nULLppv로 사용하여 MK_S_ASYNCHRONOUS 반환합니다. 호출자는 나중에 IBindStatusCallback::OnObjectAvailable 메서드 중에 실제 개체 포인터를 받게 됩니다. 그런 다음, 다음 단계는 일반적으로 다른 실행 스레드에서 호출자에게 비동기적으로 발생합니다.
  7. URL 모니커에 의해 지정된 리소스의 클래스는 다음 방법 중 하나로 결정됩니다.
    • URL 모니커는 데이터의 미디어 형식을 검사합니다. 미디어 형식이 application/x-oleobject인 경우 실제 데이터(Content-Body)의 처음 16바이트에는 리소스의 CLSID가 포함되며 후속 데이터는 클래스 자체에서 해석됩니다. 다른 모든 미디어 형식의 경우 URL 모니커는 시스템 레지스트리에서 HKEY_CLASSES_ROOT\MIME\Database\Content-Type\<media-type>\CLSID 키를 찾습니다. application/x-oleobject는 application/oleobject가 승인될 때까지 사용됩니다.
    • URL 모니커는 도착하는 데이터의 일부를 HKEY_CLASSES_ROOT\FileTypes 아래의 시스템 레지스트리에 등록된 패턴과 일치합니다.
    • 마지막으로, 다른 모든 항목이 실패하면 URL 모니커는 리소스의 후행 확장(있는 경우)을 HKEY_CLASSES_ROOT\.??? 사용하여 CLSID와 상호 연결합니다. GetClassFile 및 셸에서 수행하는 것처럼 시스템 레지스트리의 키입니다.
  8. 클래스를 결정했으므로 URL 모니커는 IUnknown 인터페이스를 요청하는 CLSCTX_SERVER CoCreateInstance를 사용하여 instance 만듭니다.
  9. URL 모니커는 IPersistMoniker 인터페이스에 대해 새로 만든 개체의 QueryInterface 메서드를 호출합니다. QueryInterface가 성공하면 URL 모니커는 IPersistMoniker::Load 전달 자체(이)를 모니커 매개 변수로 호출합니다. 개체는 일반적으로 BindToStorage 를 호출하여 관심 있는 스토리지 인터페이스를 요청합니다.
  10. 그렇지 않으면 URL 모니커는 IPersistStream에 대해 QueryInterface를 호출하고, 성공하면 IPersistStream::Load를 호출하여 전송에 의해 비동기적으로 채워지는 스트림 개체에 대한 IStream 포인터를 개체에 전달합니다.

    호출되는 클래스가 범주 CATID_AsyncAware 표시되지 않으면 데이터를 사용할 수 있게 될 때까지 해당 참조 데이터를 아직 사용할 수 없는 ISequentialStream::Read 또는 ISequentialStream::Write 를 호출합니다. 이러한 호출은 기존 COM 의미에서 차단합니다. 특정 메시지를 처리할 수 있는 메시지 루프가 입력되고 스레드의 IMessageFilter 가 적절하게 호출됩니다.

    클래스가 범주 CATID_AsyncAware 표시된 경우 ISequentialStream::Read 또는 ISequentialStream::Write 를 호출하여 해당 참조 데이터를 아직 사용할 수 없는 E_PENDING 반환합니다.

  11. 그렇지 않으면 URL 모니커는 IPersistFile에 대해 QueryInterface를 호출하고, 성공하면 임시 파일로 다운로드를 완료합니다. 완료되면 URL 모니커는 IPersistFile::Load를 호출합니다. 생성된 파일은 다른 인터넷 다운로드 데이터와 함께 캐시됩니다. 클라이언트는 이 파일을 삭제하지 않아야 합니다.
  12. 개체가 이전 단계에서 설명한 다양한 Load 호출 중 하나에서 반환되면 URL 모니커는 IBindStatusCallback::OnObjectAvailable 메서드를 호출하여 클라이언트가 BindToObject를 호출할 때 클라이언트가 원래 요청한 인터페이스 포인터를 반환합니다.

요구 사항

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

추가 정보

BindMoniker

Imoniker