2012-03-29 1 views
9

Ich versuche, eine Anwendung zu entwerfen, die COM-Objekte und ihre Eigenschaften in einer anderen Anwendung identifizieren kann. Dies ist mein erster Versuch, und ich bin nicht sicher, wo ich anfangen soll. Idealerweise wird es mit Delphi XE2 erstellt, aber ich bin offen für Vorschläge.Identifizieren/Auflisten von COM-Objekten und Eigenschaften von Software von Drittanbietern

Wenn ich die CLSID habe, gibt es irgendeine Möglichkeit, eine laufende Anwendung zu "scannen", welche Objekte darauf basieren? Oder gibt es eine andere Möglichkeit, aktive Objekte in einer laufenden Anwendung aufzulisten/zu finden?

Jede Hilfe ist sehr geschätzt, ebenso wie jede Richtung zu einer guten Dokumentation zu diesem Thema.

Bearbeiten: Das Problem ist eigentlich herauszufinden, die COM-Objekte in einer anderen Anwendung, Auflistung Eigenschaften und was auch immer ich brauche, wurde bereits in anderen Fragen beantwortet.

+0

Code in andere Anwendung injizieren, die GetActiveObject für alle bekannten Anwendungsobjekte im System aufruft. Tut mir leid, ich kann mir nichts anderes vorstellen. –

+0

Probieren Sie die [GetRunningObjectTable] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684004%28v=vs.85%29 .aspx) Funktion? – RRUZ

+0

Ich hatte begrenzten Erfolg mit ROT, da anscheinend die Anwendung Objekte explizit registrieren muss, was nicht immer der Fall ist. –

Antwort

6

Es gibt keine Möglichkeit, nach ausgeführten COM-Objekten zu suchen. Sobald sie instanziiert werden, handelt es sich nur um Speicherstücke, die von etwas anderem referenziert werden (Member-Interface-Pointer-Variablen usw.).

Manchmal werden Objekte auf die Tabelle laufender Objekte (ROT) gesetzt und Sie können sie von dort abrufen, wie bereits in Kommentaren vorgeschlagen. Diese Attribute für, sagen wir, < 1% der COM-Objektinstanzen, aber vielleicht haben Sie das Glück, genau diese zu jagen.

Der einzige Weg, an den ich denken kann, ist Hook COM-Objekt Instanziierung in, so dass Sie die Erstellung abfangen und dann in der Lage sein, Ihre eigene Liste der vorhandenen Instanzen zu verfolgen. Dies ist jedoch kein einfacher Weg (und es ist auch am wahrscheinlichsten unsicher).

Um dies zu erreichen, müssen Sie entweder Ihr Klassenobjekt im Kontext des laufenden Prozesses für die CLSID Ihres Interesses registrieren und Ihre Klassenfabrik die Instanziierungsaufrufe erhalten. Oder, Haken CoCreateInstance API, wie mit Detours.

Sobald Sie Instanz Instanziierung haben Sie Zeiger im Moment der Objekterstellung und Sie müssen wieder etwas tun mit ihnen. Sie möchten diese Instanziierungsaufrufe an die ursprüngliche API weiterleiten und dann die Lebensdauer der Instanzen verfolgen. Wenn Sie einen zusätzlichen Verweis auf das Objekt einfügen, ändern Sie wahrscheinlich das ursprüngliche Verhalten der Anwendung. Andernfalls haben Sie keine Kontrolle über die COM-Objektfreigabe abzufangen. Manchmal können die COM-Klassen aggregiert erstellt werden und Sie können die ursprüngliche Instanz mehr oder weniger sauber in Ihr COM-Objekt einbetten.

Alles in allem scheint die Aufgabe im Allgemeinen nicht realisierbar zu implementieren. Mit Interesse und mit etwas Glück haben Sie die Möglichkeit, dies zu tun.

+0

Vielleicht nähere ich mich dem in die falsche Richtung und über komplizierte Dinge? Ich muss in der Lage sein, ein paar Etiketten und Bearbeitungen in einer Anwendung zu lesen, die in VB6 entwickelt wurde, aber ich habe keinen Zugriff auf Quellcodes. Würden Sie dazu sagen, dass ich noch Instanziierungen anhängen müsste? –

+0

@Roman, ist es möglich, Informationen von ROT zu erhalten, auf welchen (Client-) Prozess einen Eintrag (falls vorhanden) aufgerufen hat? Wenn nicht, ist Ihr zweiter Absatz für die Frage irrelevant, da die Frage danach fragt, wie Sie wissen, welche Objekte ein bestimmter Prozess instanziiert hat. –

+0

@MPR, meiner Meinung nach ist das Scannen von Speicher für Instanzen definitiv der falsche Weg. Angesichts der Tatsache, dass Sie eine Signatur der Instanz, des Heaps, der Instanz usw. haben, sieht es immer noch extrem schmerzhaft aus. Aber Sie scheinen viel mehr über Ihre Objekte zu wissen - sind das ActiveX-Steuerelemente? Wenn sie sind, esp. Fenstered, dann können Sie Windows der Kontrollen finden, und wenn sie ATL-basiert sind, was wahrscheinlich ist, können Sie vielleicht ATL-Nachrichten verwenden, um Schnittstellen von 'HWNDs zu erhalten, und wenn dieser Haken funktioniert - Sie sind gut zu bewegen zum Aufzählen von Eigenschaften über bekannte Schnittstellen. –