Red de conocimiento informático - Material del sitio web - ¿Cómo descubrir com en tiempo de ejecución e implementar funciones de complemento?

¿Cómo descubrir com en tiempo de ejecución e implementar funciones de complemento?

1. Es fácil descubrir qué DLL admite COM. Simplemente cargueLibary uno por uno y vea si hay un DllRegisterServer.

2 No es fácil encontrar el CLSID de COM en un componente. Sólo existen algunos métodos:

(1) Si hay un archivo .tlb, puede hacerlo. descompile el tlb en un archivo idl y luego busque CoClass en idl. Hay muchos códigos descompilados en Internet y también puede usar directamente las herramientas proporcionadas por VC, que parece llamarse TLB*.exe

(2) Si no hay .tlb, use El mismo método para ver si el dll se ha compilado. Escriba la información de la biblioteca.

(3) Si no puede encontrar la información de la biblioteca de tipos, no tiene más remedio que buscarla en el registro. Primero registre esta DLL (regsvr 32 this.dll, o llame directamente al DllRegisterServer obtenido anteriormente) y luego vaya al CLSID en el registro para encontrar qué CLSID contiene this.dll.

3 Después de encontrar el CLSID, puede crear directamente el componente CoCreateInstance o DllGetClassObject en la DLL.

Luego crea un IUnknown y busca la interfaz que deseas.

Si ni siquiera sabes qué interfaces y métodos llamar, entonces no lo hagas. No siempre puedes pasar NULL a un método.

Hay que conocer la interfaz. Eso es costumbre. Para realizar la función del complemento, todos los dlls implementan la misma interfaz tlb, lo que definitivamente no es el caso.

Incluso si lo hay, su método no es factible. ¡Ese es mi propio complemento! Quiero escanear el directorio del complemento en tiempo de ejecución.

Encuentre todos los archivos DLL, obtenga información sobre ellos (cree su caso, ajuste una función) y muéstrela en la interfaz de alguna forma.

Cuando el usuario seleccione la función, la usaré.

No puedo permitir que el usuario descargue un complemento y descompile su tlb.

Es muy fácil encontrar las interfaces de todas las DLL durante la etapa de programación.

Lo que quiero es el efecto del período de ejecución. No entiendo muy bien lo que dijiste. ¿Es necesario encontrar una dll?

Registrarlo1.

Busca en el registro de Laochang para ver cuál tiene este dll y encuentra el clid.

Obtiene el caso según la identificación de la interfaz y el clid.

Parece una gran curva. Creo que la respuesta correcta no es así.

1) Descompilar la información de la biblioteca es en realidad obtener una interfaz, consultar la información y llamar a LoadTypeLib.

2) Si no puede obtener la información de la biblioteca de tipos, solo puede buscar en el registro y no hay absolutamente ninguna otra manera.

El CLSID no se puede obtener de la DLL COM (excluyendo CLSID_Factory y similares, por supuesto).

Un método que probé antes fue analizar archivos DLL. Puedes encontrar ProgidCurvera 1 SVR. fun { 969 e 8460-D5CB-4690-A566-a7e 2e 9095d 5d } está en él, pero esta información será diferente en el dll generado en diferentes entornos de desarrollo, por lo que está incompleta. Dijiste que la DLL la escribiste tú mismo. Si la DLL que buscas la escribí yo,

Nunca dije que la DLL la escribí yo. Dije que la interfaz la defino yo mismo. Pero gracias por tu preocupación, te daré puntos.

La clave está en solucionar el problema. ¿De qué sirven 20 puntos?

He escrito algo similar a OleView para mi tutor antes. A diferencia de OleView, la DLL que se va a visualizar no está registrada. En ese momento, también tuve dolor de cabeza durante más de un mes para recibir el clsid. Al final, no pude sacarlo usando ITypeLib, pero a veces no hay información de la biblioteca de tipos y no hay nada que podamos hacer.

¡Espera a que aparezca Daniel y muestre su historia!

Pensé en una solución a mi problema con el complemento.

1 La persona que proporciona el complemento también debe proporcionar archivos de configuración como (xxx.dll, xxx.conf).

El archivo de configuración contiene el CLID (porque es un complemento, el ID de la interfaz es fijo).

Al instalar el complemento, registre la dll.

3 Cuando utilice complementos, no intente leer todos los archivos de configuración ni crear objetos COM basados ​​en los archivos de configuración. La práctica es el único criterio para probar la verdad. Probaré tu pregunta. Busqué algunas publicaciones y el significado general es: usar Invoke of IDispatch.

También hay una característica interesante.

CLSIDFromProgID

Por ejemplo: CLSID clsid

CLSIDFromProgID(L " testcom 1 . test get ", & ampclsid

Sitio web); :

Debe implementar una interfaz predefinida, que usted define y cuyo ID de interfaz es conocido. Solo necesita cargar estos componentes com, consultar la información de la biblioteca de tipos a través de la interfaz iDispatch, encontrar la ID de la interfaz existente, lo que indica que es un complemento para este programa y luego consultar la ID de la clase (puede haber más de una) a través de la biblioteca de tipos. Todo lo que necesita hacer es crearlo con coCreateInstance como un objeto. Tenga en cuenta que estas comunicaciones deben registrarse cuando se instala el programa.

Si com no admite la interfaz iDispatch, puede guardar el ID de clase del complemento en el archivo de configuración o registro con anticipación, leer estos ID de clase cuando se inicia el programa y usar coCreateInstance combinado con la interfaz. ID para crear un objeto.

Mi pregunta. ¿Alguien puede ayudarme a echar un vistazo? Simplemente proporcione todos los CLSID dentro de una DLL o COM OCX.

Generalmente, COM DLL u OCX tiene una biblioteca de tipos, puede usar LoadTypeLib/LoadTypeLibEx para abrirla y obtener la información que necesita.

Consulte www.codeguru.com/Cpp/COM-Tech/atl/atl/article.php/c57/

CodeGuru: vea el proyecto ATL de la biblioteca de tipos

Gracias, no esperaba tantas buenas soluciones. Déjame resumir tus pensamientos. 1 El proveedor del complemento debe proporcionar CLSID. En cuanto a la ubicación de almacenamiento, puede ser

Datos personales (yo)

Registro (wangweixing2000)

* * *La misma función de salida dll (nelsonc ( software Rabbit) )) Creo que el método de Software Rabbit es mejor. Simplemente use regsvr32 directamente. No se necesita ningún programa de instalación especial.

El método de registro requiere que utilice su propio programa de instalación para agregar el registro y obtener el complemento. Pero una ventaja es que no tiene nada que ver con la ubicación del complemento. Los otros dos métodos deben ubicarse en directorios específicos.

Pensé en el archivo de configuración. Definitivamente era lento y malo en ese momento, así que iba a usar el método del conejo de software. 2 Todos estos complementos implementan la misma interfaz (

Buena idea, pero ¿cómo hacerlo?

Cuando usas ATL, cuando creas un nuevo objeto ATL, creas una interfaz y.

Intenté cambiar el nombre de los dos objetos a la fuerza en un solo objeto y el resultado pareció ser un error de redefinición.

No me digas. Cuando uso VB, la interfaz no. mostrado, solo un objeto.

)

Las interfaces implementadas por estos complementos heredan de la misma interfaz.

Esto es absolutamente factible.

¡Pero todavía no sé cómo hacerlo!

Por favor, enséñame las gambas.

Por ejemplo, use vc para definir una interfaz y use vb para definir un objeto de subinterfaz de esta interfaz. 3. Utilice iDispatch para llamar al complemento.

Gracias

Con oleview, podemos ver que todos los com escritos están en el mismo directorio, y estos son el mismo tipo de com y deben llamarse de manera uniforme. Encuentre los complementos instalados enumerando todos los coms en ese directorio y llamándolos uno por uno. De hecho, com es una clase global a la que cualquiera puede llamar. Primero implemente el generador de clases y luego use GetObject del generador de clases para obtener el objeto de función.

En este momento, si configura todas las clases con comportamiento uniforme en el mismo GUID, debería estar bien. Si solo una clase usa IUnkown, es decir:

Fábrica de clases: GUID_ABC{12345...}

Interfaz: iid_a{...1},iid_ b {... 2}....

Fábrica de clases: GUID_BCD{123456...}

Interfaz: iid_a {...1}, iid_b { ...2} ...

Los GUID de las interfaces son todos iguales. Al llamar, simplemente use CLIDFromProgID para obtener el ProgramID de diferentes complementos.