IModelKeyReference2::GetKey 메서드(dbgmodel.h)

키 참조의 GetKey 메서드는 IModelObject 의 GetKey 메서드처럼 동작합니다. 기본 키의 값과 키와 연결된 메타데이터를 반환합니다. 키 값이 속성 접근자인 경우 IModelObject에 상자가 있는 속성 접근자(IModelPropertyAccessor)를 반환합니다. 이 메서드는 속성 접근자에서 기본 GetValue 또는 SetValue 메서드를 호출하지 않습니다.

구문

HRESULT GetKey(
  _COM_Errorptr_opt_ IModelObject **object,
  IKeyStore                       **metadata
);

매개 변수

object

키 값이 여기에 반환됩니다.

metadata

키와 연결된 선택적 메타데이터가 여기에 반환됩니다.

반환 값

이 메서드는 성공 또는 실패를 나타내는 HRESULT를 반환합니다.

설명

코드 예제

ComPtr<IModelObject> spObject; /* get an object */

ComPtr<IModelKeyReference> spKeyRef;
if (SUCCEEDED(spObject->GetKeyReference(L"Id", &spKeyRef, nullptr)))
{
    ComPtr<IModelObject> spKey;
    if (SUCCEEDED(spKeyRef->GetKey(&spKey, nullptr)))
    {
        // spKey contains the equivalent of spObject->GetKey(L"Id", &spKey, nullptr)
        // This may be a property accessor since this was not a GetKeyValue.  
        // Check and fetch.  Note that GetKeyValue would do this for you.
        ModelObjectKind kind;
        if (SUCCEEDED(spKey->GetKind(&kind)))
        {
            if (kind == ObjectPropertyAccessor)
            {
                VARIANT vtProp;
                if (SUCCEEDED(spKey->GetIntrinsicValue(&vtProp)))
                {
                    // We are guaranteed *in-process* that the IUnknown is 
                    // an IModelPropertyAccessor via the ObjectPropertyAccessor
                    IModelPropertyAccessor *pProperty =
                        static_cast<IModelPropertyAccessor *>(vtProp.punkVal);
                    
                    // In order to fetch, we need to know the context object and 
                    // the key name.  Fetch it from the key reference.
                    ComPtr<IModelObject> spContextObject;
                    if (SUCCEEDED(spKeyRef->GetContextObject(&spContextObject)))
                    {
                        BSTR keyName;
                        if (SUCCEEDED(spKeyRef->GetName(&keyName)))
                        {
                            ComPtr<IModelObject> spKeyValue; 
                            if (SUCCEEDED(pProperty->GetValue(keyName,
                                                              spContextObject.Get(),
                                                              &spKeyValue)))
                            {
                                // spKeyValue contains the value of the "Id" key.
                            }

                            SysFreeString(keyName);
                        }
                    }

                    VariantFree(&vtProp);
                }
            }
            else
            {
                // spKey contains the value of the "Id" key.
            }
        }
    }
}

요구 사항

요구 사항
헤더 dbgmodel.h

추가 정보

IModelKeyReference2 인터페이스