Eben leider nicht. Ich such selber schon verzweifelt da nach.
Im
MSDN steht zwar, wie ich mir einen Moniker-String zusammenbauen kann, aber das greift nur dann, wenn ich den Pfad dahin schon kenne. Ich möchte aber generisch zu einem Objekt den Moniker-String haben. Und da ich in dem Moment nicht weiss, auf welchem Objekt / auf welcher Klasse ich mich gerade befinde weiss ich auch nicht, wie ich eines der vorhandenen Objekte eindeutig identifizieren kann.
Edit Nachtrag:
Wie komme ich zu den Objekten? : Ich habe mir einen
WMI-Browser gebastelt, mit dem ich alle verfügbaren Klassen und alle davon existierenden Objekte einfach durchklicken kann. Da ich beim listen der Objekte jeweils nur kurz für den Zeitpunkt der Enumeration die Werte habe, und danach die Referenz verliere, brauche ich eben möglichst einfach einen Moniker, den ich ablegen kann:
Delphi-Quellcode:
procedure TForm1.getInstanceInformation;
var
l_Value: Cardinal;
l_objEnum: IEnumVariant;
l_tempObj: OleVariant;
l_Enumerator: IEnumVariant;
l_tempValue: OleVariant;
l_PropIsArray: boolean;
l_PropertyValue: string;
l_lstItem: TListItem;
i,j: integer;
begin
lstInstances.Items.Clear;
j:= 1;
l_objEnum := IEnumVariant( m_WMIServices.InstancesOf(m_ClassName, wbemFlagReturnImmediately, nil).Get__NewEnum );
while (l_objEnum.Next(1, l_tempObj, l_Value) = S_OK) do
begin
l_lstItem := LstInstances.Items.Add;
l_lstItem.Caption := IntToStr(j);
l_Enumerator := IEnumVariant( SWbemObject(IUnknown(l_tempObj)).Properties_.Get__NewEnum );
while (l_Enumerator.Next(1, l_tempValue, l_Value) = S_OK ) do
begin
l_PropIsArray := ISWbemProperty(IUnknown(l_tempValue)).IsArray;
l_PropertyValue := '';
if VarType(ISWbemProperty(IUnknown(l_tempValue)).Get_Value) = varNull then
l_PropertyValue := '<null>'
else
// get data type of property
case ISWbemProperty(IUnknown(l_tempValue)).CIMType of
// hier die Datentypen holen... [...]
wbemCimtypeChar16: l_PropertyValue := '<16bit character>';
wbemCimtypeObject: l_PropertyValue := '<CIM - Object>';
else
l_PropertyValue := 'unknown';
end;
l_lstItem.SubItems.Add(l_PropertyValue);
end; // of property enumeration
inc(j);
end; // of obj enumeration
end;
Edit2: Datentypen aus Code zur besseren Übersicht entfernt