Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#3

Re: Moniker von COM-Objekt ermitteln

  Alt 19. Jul 2004, 14:37
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
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat