IDataModelManager2::AcquireSubNamespace 메서드(dbgmodel.h)
AcquireSubNamespace 메서드는 동적 언어의 새 개체보다 일반적으로 언어 네임스페이스처럼 보일 수 있는 항목을 생성하는 데 도움이 됩니다. instance 경우 호출자가 프로세스 개체의 속성을 분류하여 프로세스 개체를 보다 체계적으로 구성하고 속성을 더 쉽게 검색하려는 경우 이 작업을 수행하는 한 가지 방법은 프로세스 개체의 각 범주에 대한 하위 개체를 만들고 해당 개체 내에 해당 속성을 배치하는 것입니다. 이 개념의 문제는 하위 개체에 자체 컨텍스트가 있고 해당 속성이 프로세스 개체 자체가 아닌 instance 포인터로 전달된다는 것입니다. AcquireSubNamespace 메서드는 하위 개체의 속성에 전달된 instance 포인터가 부모 개체인 공유 소유권 "하위 개체"를 만드는 데 도움이 됩니다.
예를 들어 프로세스 힙(및 프로세스 내의 다른 모든 사용자 지정 힙)을 나타내는 Heaps 속성을 추가하려는 프로세스 개체를 고려해 보세요. 처음에는 다음과 같이 표시될 수 있습니다.
• Process [foo.exe]
o Heaps [3 heaps]
프로세스 개체에는 다른 많은 필드가 있을 수 있으며 프로세스에서 메모리와 관련된 많은 항목이 있을 수 있으므로 더 나은 패러다임은 다음과 같습니다.
• Process [foo.exe]
o Memory [A namespace of things associated with Memory in the process]
Heaps
위의 Memory 개체가 단순히 새 개체를 반환하는 일반 속성인 경우 호출자가 someProcess.Memory.Heaps를 요청할 때 Heaps 속성의 속성 접근자는 프로세스의 다른 특성으로 돌아갈 수 있는 쉬운 방법 없이 새로 만든 Memory 개체의 컨텍스트 개체(이 포인터)를 전달합니다. Memory 개체를 AcquireSubNamespace 메서드로 대신 만드는 경우 패러다임은 Memory 개체의 속성 접근자가 프로세스 개체 자체가 아니라는 점을 제외하고 위와 같이 표시됩니다. 이렇게 하면 Heaps 속성 구현이 프로세스의 다른 특성으로 쉽게 돌아갈 수 있습니다. 이 개체 스타일은 하위 개체 대신 하위 네임스페이스입니다.
AcquireSubNamespace 메서드가 다른 메서드로 수행할 수 없는 작업은 없습니다. 실제로 이 메서드는 다음을 수행하는 도우미 메서드입니다.
• Checks if there is a model registered under the name given by subNamespaceModelName. If so, returns it. If not, proceeds to:
o Creates and registers a new model under the name given by subNamespaceModelName
o Acquires the model registered under the name given by modelName.
o Adds a new property named according to accessName with metadata supplied by the metadata argument. The accessor for this property returns a new object with special properties:
The new object has the model created and registered under subNamespaceModelName attached as a parent.
The parent model has a context adjustor. The context adjustor is a property.
The context adjustor property getter returns the original process object.
하위 네임스페이스가 만들어지면 해당 소유권은 동일한 인수 집합을 사용하여 AcquireSubNamespace 메서드의 모든 잠재적 호출자 간에 공유되는 것으로 간주됩니다. 공유 소유권 의미 체계로서 하위 네임스페이스의 등록을 임의로 등록 취소하는 것은 부적절합니다.
구문
HRESULT AcquireSubNamespace(
PCWSTR modelName,
PCWSTR subNamespaceModelName,
PCWSTR accessName,
IKeyStore *metadata,
IModelObject **namespaceModelObject
);
매개 변수
modelName
하위 네임스페이스를 사용하여 확장되는 데이터 모델의 이름입니다.
subNamespaceModelName
하위 네임스페이스 자체를 나타내는 데이터 모델의 이름입니다. 새로 만든 하위 네임스페이스는 이 이름으로 등록될 데이터 모델입니다.
accessName
하위 네임스페이스에 액세스하기 위해 modelName 인수에서 지정한 이름으로 등록된 데이터 모델에 이 이름의 속성이 추가됩니다.
metadata
이 호출이 공유 하위 네임스페이스를 만드는 경우 accessName에서 제공한 키와 연결할 선택적 메타데이터입니다.
namespaceModelObject
하위 네임스페이스를 나타내는 데이터 모델이 여기에 반환됩니다. 이 데이터 모델은 AcquireSubNamespace 메서드에 대한 이전 호출 또는 현재 호출에 의해 만들어졌을 수 있습니다. 소유권은 모든 호출자 간에 공유되는 것으로 간주됩니다.
반환 값
이 메서드는 HRESULT를 반환합니다.
설명
예제 코드
ComPtr<IDataModelManager> spManager; /* get the data model manager */
ComPtr<IModelObject> spExtensionModel; /* get a data model you want to extend
some namespace with (see
CreateDataModelObject) */
// Add a shared namespace called "Memory" to Process. Then extend this namespace
// with spExtensionModel
ComPtr<IModelObject> spProcessMemory;
if (SUCCEEDED(spManager->AcquireSubNamespace(
L"Debugger.Models.Process",
L"Debugger.Models.Process.Memory",
L"Memory",
nullptr /* probably should have help metadata! */,
&spProcessMemory)))
{
if (SUCCEEDED(spProcessMemory->AddParentModel(spExtensionModel.Get(),
nullptr,
false)))
{
// The properties on spExtensionModel are now in "Process.Memory.*"
// In addition, the context (*this*) pointer passed to properties on
// spExtensionModel is the process object itself, not some empty
// synthetic created for the namespace!
}
}
요구 사항
요구 사항 | 값 |
---|---|
헤더 | dbgmodel.h |