AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Moniker von COM-Objekt ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Moniker von COM-Objekt ermitteln

Ein Thema von Phoenix · begonnen am 19. Jul 2004 · letzter Beitrag vom 19. Jul 2004
Antwort Antwort
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#1

Moniker von COM-Objekt ermitteln

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

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Moniker von COM-Objekt ermitteln

  Alt 19. Jul 2004, 12:35
Hast Du mal einen Code in z.B. VB, wie man es da machen würde

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

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

Re: Moniker von COM-Objekt ermitteln

  Alt 19. Jul 2004, 13: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
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#4

Re: Moniker von COM-Objekt ermitteln

  Alt 19. Jul 2004, 14:43
Habs grad rausgefunden...

Der Moniker ist der Pfad zum Objekt, also entsprechend der ObjectPath...
l_Moniker := SWbemObject(IUnknown(l_tempObj)).Get_Path_.Path ;
Basierend auf obigem Code...
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:23 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