2011-10-12 14 views
5

Tengo un programa escrito en QT que funciona bien. Sin embargo, tiene una dependencia indirecta de dnssd.dll ya que un dll cargado por el programa usa bonjour. Si Bonjour no está instalado en la máquina que ejecuta el programa que va a decirMejorando el mensaje de error que falta dll

El programa no puede iniciarse porque dnssd.dll no se encuentra en su computadora . Intente volver a instalar el programa para solucionar el problema.

No estoy cargando este dll a través de LoadLibrary o de lo contrario. Vinculaba el binario con el stub para que se cargue automáticamente antes de int main.

Obviamente, la reinstalación del programa no soluciona el problema. Para mí, claramente dice que necesito instalar Bonjour, pero para la mayoría de los usuarios esto es extremadamente críptico.

Prefiero que este mensaje de error sea algo más informativo, como "Necesita instalar Bonjour para que esta aplicación funcione correctamente, vaya a [insert-url-here] para descargarla".

¿Hay alguna manera de detectar cuando un archivo DLL no carga esto y da un mejor mensaje de error?

+2

¿Por qué no se empaqueta Bonjour en el instalador (no puedo decir cómo sin saber qué tipo de programa de instalación que está utilizando), o algo similar? –

+1

Buena idea. La gente tiende a desinstalarlo ya que no saben de qué se trata. También es una molestia y creará un instalador más complicado y frágil. Tiene que tomar en cuenta que Bonjour ya está instalado, etc. – vidstige

+1

¿Prefiere una aplicación más complicada y frágil en su lugar? Los buenos marcos de instalador proporcionan soluciones robustas para la mayoría de estos problemas. Este no es un problema sin resolver. –

Respuesta

5

Configúrelo para retrasar la carga, luego tan pronto como sea posible (antes de que ocurra la carga), intente cargarlo usted mismo (con LoadLibrary) e informe el problema.

http://msdn.microsoft.com/en-us/library/151kt790.aspx

+0

, ¿entonces básicamente está diciendo que no hay forma de detectar cuándo un dll que se vinculó con un stub no se carga? – vidstige

+1

Si deja que la carga suceda automáticamente, no lo creo, pero si solo cambia la configuración de un enlace y luego agrega algunas líneas de código, entonces sí, es posible. –

+1

No necesita hacer las llamadas a través de GetProcAddress ni nada de eso. Va a cargar solo para comprobar que la biblioteca está allí; luego llama a las funciones como lo hace normalmente sabiendo que el proceso de carga tendrá éxito. Delay Load simplemente mueve la LoadLibrary realizada por el tiempo de ejecución a cuando realmente usa el DLL. –

Cuestiones relacionadas