Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Moniker von COM-Objekt ermitteln (https://www.delphipraxis.net/26150-moniker-von-com-objekt-ermitteln.html)

Phoenix 19. Jul 2004 12:33


Moniker von COM-Objekt ermitteln
 
Hallöchen,

leider blieb die Suche (hier, Google, MSDN) recht erfolglos.

Wie kann ich einen Moniker zu einem bereits im Zugriff befindlichen COM-Objekt erzeugen?

Hier konkret am Beispiel WMI: Ich habe eine Liste an SWbemObjects vom Typ Win32_Service. Nun möchte ich, wenn ich eh schon über die Objekte enumeriere und deren Propertys anzeigen lassen will, auch gleich für jedes Objekt noch den jeweiligen Moniker speichern, um hinterher schnell und gezielt das Objekt wieder zu bekommen ohne mir auf jedes einzelne Objekt eine Referenz zu speichern.

Eine Methode .GetMoniker gibts da ja leider nicht :-/
Hat mir jemand eine Idee wie ich das anstellen kann?

sakura 19. Jul 2004 12:35

Re: Moniker von COM-Objekt ermitteln
 
Hast Du mal einen Code in z.B. VB, wie man es da machen würde :gruebel:

...:cat:...

Phoenix 19. Jul 2004 13:37

Re: Moniker von COM-Objekt ermitteln
 
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

Phoenix 19. Jul 2004 14:43

Re: Moniker von COM-Objekt ermitteln
 
Habs grad rausgefunden...

Der Moniker ist der Pfad zum Objekt, also entsprechend der ObjectPath...
Delphi-Quellcode:
l_Moniker := SWbemObject(IUnknown(l_tempObj)).Get_Path_.Path
;
Basierend auf obigem Code...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz