2012-03-29 24 views
9

Estoy tratando de diseñar una aplicación que pueda identificar objetos COM y sus propiedades en cualquier aplicación diferente. Esta es la primera vez que intento hacerlo, y no estoy seguro de por dónde empezar, incluso. Idealmente, se haría usando Delphi XE2, pero estoy abierto a sugerencias.Identificación/listado de objetos COM y propiedades de software de terceros

Si tengo el CLSID, ¿hay alguna forma de "escanear" una aplicación en ejecución para saber qué objetos se basan en ella? O, yendo de otra manera, ¿hay una mejor manera de enumerar/encontrar objetos activos en cualquier aplicación en ejecución?

Cualquier ayuda es muy apreciada, así como cualquier instrucción para una buena documentación sobre el tema.

Edición: El problema es descubrir los objetos COM en cualquier otra aplicación, enumerar las propiedades y todo lo que necesito ya ha sido respondido en otras preguntas.

+0

Inyecte el código a otra aplicación que llamaría GetActiveObject para todos los objetos de aplicación conocidos en el sistema. Lo siento, no se me ocurre nada más ... –

+0

¿Has probado el [GetRunningObjectTable] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684004%28v=vs.85%29 .aspx) función? – RRUZ

+0

He tenido un éxito limitado con ROT, ya que aparentemente la aplicación debe registrar objetos explícitamente, lo que no siempre es el caso. –

Respuesta

6

No hay forma de escanear para ejecutar objetos COM. Tan pronto como se crean instancias, son solo piezas de memoria referenciadas por otra cosa (variables de puntero de interfaz de miembro, etc.).

A veces los objetos se colocan en la Tabla de Objetos en ejecución (ROT) y puede recuperarlos desde allí, como ya se sugirió en los comentarios. Esto se atribuye a, digamos, < 1% de instancias de objetos COM, pero tal vez tenga la suerte de perseguirlos exactamente.

La única forma en que puedo pensar es en enganchar la creación de objetos COM para que pueda interceptar la creación y luego pueda seguir su propia lista de instancias existentes. Aunque esta tampoco es una manera fácil (y también es más probable que no sea segura).

Para lograr esto, necesita registrar su objeto de clase en el contexto del proceso en ejecución para el CLSID de su interés y hacer que su fábrica de clases reciba las llamadas de creación de instancias. O bien, enganche CoCreateInstance API, como con Detours.

Una vez que está enganchando la instanciación tiene punteros en el momento de la creación del objeto y nuevamente necesita hacer algo con ellos. Desearía reenviar esas llamadas de creación de instancias a la API original y, luego, rastrear el tiempo de vida de las instancias; si hace una referencia adicional al objeto, es probable que modifique el comportamiento original de la aplicación. De lo contrario, no tiene control para interceptar la liberación del objeto COM. A veces las clases COM se pueden crear agregadas y puede incrustar más o menos limpiamente la instancia original en su objeto COM.

En general, en general, la tarea no parece factible de implementar. Tener un interés específico de CLSID, con un poco de suerte y un poco de esfuerzo, podría ser exitoso al hacerlo.

+0

¿Quizás me estoy acercando a esto de la manera incorrecta y complicando las cosas? Tengo que poder leer algunas etiquetas y ediciones en una aplicación desarrollada en VB6, pero no tengo acceso a los códigos de fuentes. Para hacerlo, ¿dirías que todavía tendría que enlazar instancias? –

+0

@Roman, ¿es posible obtener información de ROT sobre qué proceso (cliente) invocó una entrada (si corresponde)? Si no, su segundo párrafo es irrelevante para la pregunta, ya que la pregunta pregunta cómo saber qué objetos instancia un proceso particular. –

+0

@MPR, mi opinión es que el escaneo de memoria para instancias definitivamente es la manera incorrecta. Dado que tiene alguna firma de la instancia, el montón de la instancia ubicada en etc. todavía parece un proceso extremadamente doloroso. Pero parece que sabe mucho más sobre sus objetos: ¿son controles ActiveX? Si lo son, esp. con ventana, entonces puedes encontrar las ventanas de los controles, y si están basadas en ATL, lo cual es probable, quizás puedas usar mensajes ATL para obtener interfaces de 'HWND's, y si este gancho funciona, estás listo para moverte en la enumeración de propiedades a través de interfaces bien conocidas. –

Cuestiones relacionadas