Red de conocimiento informático - Conocimiento sistemático - Discusión en profundidad sobre la tecnología de gancho. Red[5]

Discusión en profundidad sobre la tecnología de gancho. Red[5]

La aplicación X continúa ejecutando tipos de ganchos, como ganchos CBT (creación de ventanas, etc.) sin cambiar de contexto. El proceso para este tipo de anzuelos es aproximadamente el siguiente.

La aplicación X tiene el foco y ejecuta la aplicación X para crear una ventana. Windows llama a la función de devolución de llamada de enlace con el parámetro de mensaje de evento CBT en el espacio de proceso de la aplicación X para continuar la ejecución.

Esto debería explicar por qué algunos tipos de ganchos funcionan con esta estructura de biblioteca, pero algunos no recuerdan que esto es exactamente lo que esta biblioteca debe hacer. Inserte los siguientes pasos después de los pasos anteriores y los pasos respectivamente.

Windows llama a la función de devolución de llamada de gancho. La función de devolución de llamada de destino ejecuta la función de devolución de llamada de destino en la DLL no administrada para encontrar su proxy de llamada administrado correspondiente. Devuelve el agente administrado ejecutando la función de devolución de llamada de destino con los parámetros apropiados y realiza el procesamiento de enlace correspondiente al mensaje especificado.

Los pasos tres y cuatro están condenados al fracaso porque no cambian el tipo de gancho. El tercer paso fallará porque la función de devolución de llamada administrada correspondiente no estará configurada para la aplicación. Tenga en cuenta que esta DLL utiliza variables globales para rastrear estos agentes administrados, la DLL del enlace se carga en cada espacio de proceso, pero el valor solo se establece en el espacio de proceso de la aplicación donde se encuentra el enlace. En todos los demás casos, están vacíos.

Tim Sylvester señala en su artículo "Otros tipos de ganchos" que usar un segmento de memoria compartida resolvería el problema, lo cual es cierto, pero como señala Tim, esas direcciones proxy alojadas no son útiles para ningún proceso. Aparte de las aplicaciones enganchadas, no tienen sentido, lo que significa que no tienen sentido y no se pueden llamar durante la ejecución de la función de devolución de llamada, lo que sería muy problemático.

Entonces, para utilizar estas funciones de devolución de llamada con tipos de enlace que no realizan cambios de contexto, necesita algún tipo de comunicación entre procesos.

He intentado usar objetos fuera de proceso en las funciones de devolución de llamada de enlace DLL no administrado de IPC. Si puedes hacer que esto funcione, me encantaría saberlo. En cuanto a mis intentos, los resultados no fueron los ideales. La razón básica es que es difícil inicializar correctamente la unidad (CoInitialize(NULL)) para varios procesos y sus subprocesos, lo cual es un requisito básico antes de utilizar el objeto.

No dudo que haya formas de solucionar esto, pero no las he probado todavía porque creo que tienen una utilidad limitada. Por ejemplo, el gancho CBT le permite cancelar la creación de una ventana. Si quieres, puedes imaginar lo que pasaría si esto funcionara.

La función de devolución de llamada de enlace comienza a ejecutarse y llama a la función de devolución de llamada de enlace correspondiente en la DLL de enlace no administrada. La ejecución debe enrutarse de regreso a la aplicación de enlace principal. La aplicación debe decidir si permite que esta llamada de creación se enrute nuevamente a la función de devolución de llamada del enlace que aún se está ejecutando. La función de devolución de llamada del enlace en la DLL del enlace no administrado recibe la acción que se realizará desde la aplicación del enlace principal. La función de devolución de llamada de enlace en la DLL de enlace no administrada toma la acción adecuada en la llamada de enlace CBT para completar la ejecución de la función de devolución de llamada de enlace.

Esto no es imposible, pero no es bueno. Espero que esto elimine el misterio que rodea a los tipos de ganchos permitidos y restringidos en la biblioteca.

Otros siete

◆Documentación de la biblioteca Hemos incluido un documento de código relativamente completo sobre la biblioteca de clases ManagedHooks, que Visual Studio NET convierte al compilar con la configuración de construcción del documento. XML de ayuda estándar. Finalmente, usamos NDoc para convertirlo en Ayuda HTML compilada (CHM). Puede ver este archivo de ayuda haciendo clic en el archivo chm de Hooks en el Explorador de soluciones para esta solución, o busque el archivo ZIP descargable asociado con este artículo.

◆ IntelliSense mejorado Si no está familiarizado con cómo Visual Studio NET usa archivos XML compilados (salida previa a NDoc), para mejorar el IntelliSense del proyecto de biblioteca de referencia, lo presentaré brevemente. Decida: Cuando utilice esta biblioteca de clases en su aplicación, puede considerar copiar una versión de compilación estable de esta biblioteca de clases en la ubicación donde desea hacer referencia a ella. Al mismo tiempo, también puede copiar el documento XML (enganches del sistema \ administrados). ganchos \ bin \ debug \ Kennedy administrado ganchos XML) en la misma ubicación. Cuando agrega una referencia a una biblioteca, Visual Studio NET lee automáticamente el archivo y lo usa para agregar documentación de IntelliSense, lo cual es muy útil, especialmente con bibliotecas de terceros como esta.

Pruebas unitarias Creo que todas las bibliotecas deberían tener pruebas unitarias correspondientes. Dado que soy socio e ingeniero de software en una empresa (principalmente responsable de las pruebas unitarias de software en el entorno .NET), a nadie debería sorprenderle que encuentre un proyecto de prueba unitaria en una solución llamada ManagedHooksTests. Para ejecutar esta prueba unitaria, debe descargar e instalar HarnessIt. Esta descarga es una versión de prueba gratuita de nuestro software de pruebas unitarias comerciales. Presté especial atención a esto en mis pruebas unitarias, los argumentos no válidos de los métodos pueden causar excepciones de memoria en C++. Aunque la biblioteca es bastante simple, las pruebas unitarias realmente me ayudan a detectar algunos errores en situaciones más sutiles.

◆Uno de los aspectos más complicados de una solución de depuración híbrida administrada/no administrada (como el código administrado y no administrado en este artículo) es la depuración. Si desea depurar código C++ en un solo paso o establecer puntos de interrupción en código C++, debe habilitar la depuración no administrada. Esta es la configuración del proyecto en Visual Studio NET. Tenga en cuenta que puede depurar los niveles administrados y no administrados en un solo paso sin problemas, pero la depuración no administrada ralentiza seriamente el tiempo de carga y la velocidad de ejecución de su aplicación durante la depuración.

Ocho advertencias finales

Obviamente, los ganchos del sistema son bastante poderosos, pero este poder debe usarse de manera responsable. Cuando los enlaces del sistema funcionan mal, pueden bloquear no solo su aplicación, sino también todas las aplicaciones que se ejecutan actualmente en su sistema, pero la probabilidad de que esto ocurra suele ser mínima. Sin embargo, aún necesita verificar su código cuando use enlaces del sistema.

Descubrí una técnica útil para desarrollar aplicaciones. Utiliza enlaces del sistema para instalar su sistema operativo de desarrollo preferido y una copia de Visual Studio NET en una PC virtual de Microsoft, y luego puede desarrollar sus aplicaciones en este entorno virtual. De esta manera, cuando ocurre un error en sus aplicaciones enganchadas, solo saldrán de la instancia virtual de su sistema operativo, no de su sistema operativo real. Cuando este sistema operativo virtual falla debido a un enlace defectuoso, tengo que reiniciar mi sistema operativo real, pero eso no es muy frecuente.

Tenga en cuenta que si se suscribe a MSDN en línea, puede utilizar Virtual PC de forma gratuita durante toda su suscripción.

Lishi Xinzhi/Article/program/net/201311/15481