![]() |
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? |
Re: Moniker von COM-Objekt ermitteln
Hast Du mal einen Code in z.B. VB, wie man es da machen würde :gruebel:
...:cat:... |
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:
Edit2: Datentypen aus Code zur besseren Übersicht entfernt
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; |
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 04:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz