viernes, octubre 26, 2007

Cómo crear accesos directos a temas de ayuda de Windows Vista

Estoy notando que es mucha gente la interesada en saber cómo crear accesos directos a los temas de ayuda y soporte técnico de Windows Vista, para tenerlos más a mano. Me refiero específicamente al contenido offline, pues el contenido online es fácilmente accesible desde http://windowshelp.microsoft.com/Windows/es-ES/default.mspx. En Windows Vista no sirve con copiar la ruta del tema y crear un acceso directo; quizá lo que haya venido haciendo hasta ahora es indicar paso por paso los enlaces que se deben pinchar para dar con el tema en cuestión, lo que resulta ciertamente engorroso.

Para acceder de manera directa a un tema de ayuda en Windows Vista, se debe hacer uso de la API pública IHxHelpPane::DisplayTask, a la que se le pasa como parámetro la URI del documento mshelp:// que queremos abrir. Incluso sería posible crear una pequeña aplicación que registrara un nuevo protocolo en el sistema y automatizara todo este proceso. Ciertamente tendría bastante aceptación, creo yo. Quizá me anime a codificarla.

jueves, octubre 11, 2007

Sobre el mensaje de error "Ha ocurrido una excepción al intentar ejecutar..."

Si observa la lista de tareas programadas incluidas por defecto en Windows Vista, verá una encargada de crear puntos de restauración con regularidad. Si accede a la pestaña Acciones verá que la tarea que se ejecuta es la siguiente: %windir%\system32\rundll32.exe /d srrstr.dll,ExecuteScheduledSPPCreation.

¿Qué significa el parámetro /d?

Cuando se incluye una DLL como parámetro del comando Rundll32.exe (muchos ficheros del Panel de control se ejecutan así), automáticamente se captura toda excepción que el código del fichero pueda producir, como por ejemplo una infracción de acceso (AV). Si esto ocurre, se muestra una ventana con el siguiente texto:

RUNDLL

Ha ocurrido una excepción al intentar ejecutar Comando

El "RunDLL" del título de la ventana puede hacer pensar que el sistema está infectado, pues el fichero Rundll.exe no se incluye en Windows XP y además Rundll.exe es un nombre muy común de los ejecutables de muchos virus. Sin embargo, el mensaje es legítimo, procede del sistema operativo.

El parámetro /d de Rundll32.exe lo que hace es evitar la captura de excepciones que comento anteriormente, lo que en ciertos casos puede resultarnos útil. Por ejemplo, en el caso de una excepción de infracción de acceso lo más probable es que entre en acción el depurador "post-mortem" por defecto de Windows (Dr. Watson), o cualquier otro que esté configurado.

En un futuro artículo mostraré en qué consisten las excepciones, de qué tipo pueden ser, cómo las maneja Windows y cómo se puede usar un depurador (Windbg, AdPlus, UserDump, etc.) para detectar error comunes en el código de ciertas aplicaciones de terceros mal diseñadas.

viernes, octubre 05, 2007

¿Sabía que...? [VII]

En esta nueva entrega de la saga "Sabía que...", pongo dos consultas breves que he recibido:

Pregunta

¿Cómo determina Administrador de tareas cuando una aplicación no responde?

Respuesta

En MSDN hay una API para saber esto mismo, IsHungApp. En la propia documentación se explica lo que tiene que ocurrir para que se determine que una aplicación no está respondiendo:
  • No espera entrada por parte del usuario.
  • No está iniciándose.
  • No ha llamado a PeekMessage o GetMessage en 5 segundos.

Pregunta

En Windows XP trabajo normalmente con un usuario limitado (¡bien hecho! :-P) y si hago doble clic sobre algún instalador, me aparece automáticamente un cuadro que me pide privilegios administrativos. ¿Cómo lo sabe Windows?

Respuesta

La respuesta a esta pregunta reside en nuestra "querida" clave de registro HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths, de la que ya hablé en un artículo anterior. En una instalación limpia de Windows verá que ya hay algunas subclaves ahí, entre otras Setup.exe, Installer.exe, Winnt32.exe, etc. Si hace un clic sobre cualquiera de ellas, verá un valor RunAsNonAdminInstall, con contenido 1. Ese es todo el secreto.