C++를 사용하여 인스턴스 만들기 및 선언
IWbemServices 인터페이스를 통해 C++에서 인스턴스를 만들 수 있습니다.
이 항목의 코드 예제에서는 다음 #include 문을 올바르게 컴파일합니다.
#include <wbemidl.h>
다음 절차에서는 기존 클래스의 인스턴스를 만드는 방법을 설명합니다.
기존 클래스의 인스턴스를 만드는 방법
IWbemServices::GetObject 또는 IWbemServices::GetObjectAsync 메서드를 호출하여 기존 클래스의 정의를 검색합니다.
다음 코드 예제에서는 GetObject 및 GetObjectAsync 메서드를 사용하여, 클래스 정의에 대한 액세스를 제공하는 IWbemClassObject 인터페이스에 대한 포인터를 가져오는 방법을 확인할 수 있습니다.
// The pSv variable is of type IWbemServices * IWbemClassObject *pNewInstance = 0; IWbemClassObject *pExampleClass = 0; IWbemContext *pCtx = 0; IWbemCallResult *pResult = 0; BSTR PathToClass = SysAllocString(L"Example"); HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx, &pExampleClass, &pResult); SysFreeString(PathToClass);
IWbemClassObject::SpawnInstance 메서드를 호출하여 새 인스턴스를 만듭니다.
다음 코드 예제에서는 새 인스턴스를 만든 다음 클래스를 해제하는 방법을 확인할 수 있습니다.
pExampleClass->SpawnInstance(0, &pNewInstance); pExampleClass->Release(); // Don't need the class any more
IWbemClassObject::Put 메서드를 호출하여, 클래스에 정의된 값을 상속하지 않는 속성의 값을 설정합니다.
클래스의 각 인스턴스는 클래스에 대해 정의된 모든 속성을 상속합니다. 그러나 원한다면 다른 속성 값을 지정할 수 있습니다.
기존 클래스에 키 속성이 있는 경우 속성을 NULL 또는 보장된 고유 값으로 설정해야 합니다. 키를 NULL 로 설정하고 키가 문자열인 경우, PutInstanceAsync 또는 PutInstance는 내부적으로 GUID를 생성하고 키에 GUID를 할당합니다. 이런 식으로 키 속성에 NULL을 지정하면 이전 인스턴스를 덮어쓰지 않는 고유한 인스턴스를 만들 수 있습니다.
다음 코드 예제에서는 예제 인스턴스 클래스의 Index 속성 값을 설정하는 방법을 확인할 수 있습니다.
VARIANT v; VariantInit(&v); V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(L"IX100"); BSTR KeyProp = SysAllocString(L"Index"); pNewInstance->Put(KeyProp, 0, &v, 0); SysFreeString(KeyProp); VariantClear(&v);
IWbemClassObject::GetQualifierSet 호출을 통해 관련 한정자의 값을 설정합니다.
GetQualifierSet 메서드는 클래스 또는 인스턴스의 한정자에 액세스하는 데 사용하는 IWbemQualifierSet 인터페이스에 대한 포인터를 반환합니다. 클래스 한정자 특성이 EnableOverride인 경우 클래스에 대해 정의된 한정자의 다른 값을 지정할 수 있습니다. 특성이 DisableOverride로 설정된 클래스 한정자는 수정하거나 삭제할 수 없습니다. 자세한 내용은 한정자 특성을 참조하세요.
선택 사항으로, 인스턴스 클래스에 대한 추가 한정자를 정의할 수도 있습니다. 클래스 선언에 표시할 필요가 없는 인스턴스 또는 인스턴스 속성에 대한 추가 한정자를 정의할 수 있습니다.
IWbemServices::PutInstance 또는 IWbemServices::P utInstanceAsync 메서드를 호출하여 인스턴스를 저장합니다.
WMI는 인스턴스를 현재 WMI 네임스페이스에 저장합니다. 따라서 인스턴스의 전체 경로는 대부분의 경우 root\default인 네임스페이스에 따라 달라집니다. 이 코드 예제의 경우 전체 경로 이름은 \\.\root\default:Example.Index="IX100"입니다.
다음 코드 예제에서는 인스턴스를 저장하는 방법을 확인할 수 있습니다.
hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult); pNewInstance->Release();
WMI에 인스턴스를 저장하면 인스턴스의 여러 속성이 잠기게 됩니다.
특히 WMI 인프라 내에 인스턴스가 있으면, WMI API를 통해 다음 작업을 수행할 수 없게 됩니다.
- 인스턴스가 속한 클래스의 부모 클래스를 변경합니다.
- 속성을 추가하거나 제거합니다.
- 속성 형식을 변경합니다.
- Key 또는 Indexed 한정자를 추가하거나 제거합니다.
- Singleton, Dynamic 또는 Abstract 한정자를 추가하거나 제거합니다.
다음 코드 예제에서는 이전 절차에서 설명한 코드 예제를 결합하여 WMI API를 이용해 기본 클래스를 만드는 방법을 확인할 수 있습니다.
void CreateInstance (IWbemServices *pSvc)
{
IWbemClassObject *pNewInstance = 0;
IWbemClassObject *pExampleClass = 0;
IWbemContext *pCtx = 0;
IWbemCallResult *pResult = 0;
// Get the class definition.
BSTR PathToClass = SysAllocString(L"Example");
HRESULT hRes = pSvc->GetObject(PathToClass, 0, pCtx,
&pExampleClass, &pResult);
SysFreeString(PathToClass);
if (hRes != 0)
return;
// Create a new instance.
pExampleClass->SpawnInstance(0, &pNewInstance);
pExampleClass->Release(); // Don't need the class any more
VARIANT v;
VariantInit(&v);
// Set the Index property (the key).
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(L"IX100");
BSTR KeyProp = SysAllocString(L"Index");
pNewInstance->Put(KeyProp, 0, &v, 0);
SysFreeString(KeyProp);
VariantClear(&v);
// Set the IntVal property.
V_VT(&v) = VT_I4;
V_I4(&v) = 1001;
BSTR Prop = SysAllocString(L"IntVal");
pNewInstance->Put(Prop, 0, &v, 0);
SysFreeString(Prop);
VariantClear(&v);
// Other properties acquire the 'default' value specified
// in the class definition unless otherwise modified here.
// Write the instance to WMI.
hRes = pSvc->PutInstance(pNewInstance, 0, pCtx, &pResult);
pNewInstance->Release();
}