[ contenidos | #winprog ]

Soluciones a Errores Comunes

Error LNK2001: unresolved external symbol _main

Un "unresolved external" (llamada externa no resuelta) ocurre cuando algún código tiene una llamada a una función en otro módulo y el enlazador no puede encontrar dicha función en ninguno de los módulos o librerías que estás enlazando.

En este caso específico, esto significa una de dos cosas: Estás intentando escribir una aplicación Win32 GUI (o una aplicación no-consola) y accidentalmente la estás compilando como Console aplication... ó realmente estás escribiendo y compilando una aplicación de consola pero no escribiste o no compilaste apropiadamente una función main().

Generalmente el primero es el error más común, si especificas como tipo de proyecto en VC++, Win32 Console, cuando crees tu proyecto obtendrás este error. También puedes obtener este error si intentas compilar desde la linea de comandos usando BC++ y olvidas especificar los parámetros correctos para decirle al compilador que haga una aplicación Win32 GUI en lugar de una aplicación de consola, la cual es la especificada por default.

Corrección

Si estás usando VC++, debes re-crear el proyecto y seleccionar como tipo de proyecto Win32 Aplication (NO "Console").

Si estás el compilador de línea de comando, BC++, debes usar -tW para especificar que se trata de una aplicación Windows.

Error C2440: cannot convert from 'void*' to 'HICON__ *' (o similar)

Si estás compilando el código de este tutorial, eso significa que lo estás compilando como código C++. El código está escrito para los compiladores de C bcc32 y VC++ y dicho código no puede compilarse exactamente igual bajo C++ debido a que C++ tiene muchas reglas estrictas acerca de conversión de tipos. C simplemente lo dejará pasar, C++ requiere que lo explicites.

VC++ (y la mayoría de los compiladores) automáticamente compilan un archivo con la extensión .cpp cuando se trata de código C++ y con la extensión .c cuando se trata de código C. Si has agregado el código del tutorial a un archivo .cpp, está es la razón exacta para obtener este error.

Si estás compilando código que no sea de este tutorial, no puedo garantizarte que sea correcto y por lo tanto puede ser un error que proviene de otro lado. Debes determinar si es seguro convertir el valor para remover el error o si realmente estás intentando que una variable sea algo que no es.

Correción

Si quieres usar C, simplemente renombra el archivo .cpp a uno con extensión .c. En otro caso, debes agregar un cast, todo el codigo de este tutorial funciona sin ningún tipo de cambios si se lo compila como C++.

Por ejemplo, esto funcionaría en C:

	HBITMAP hbmOldBuffer = SelectObject(hdcBuffer, hbmBuffer);

Pero en C++ necesita un cast

	HBITMAP hbmOldBuffer = (HBITMAP)SelectObject(hdcBuffer, hbmBuffer);

Fatal error RC1015: cannot open include file 'afxres.h'.

VC++ agrega afxres.h a los archivos de recursos aún cuando no estamos usando un proyecto MFC y este archivo sólo puede ser instalado si se instala MFC. Este particular archivo realmente no es necesario, por lo tanto para corregir el error podemos editar el archivo .rc en el block de notas y reemplazar ambas apariciones de afxres.h con winres.h (observa que debe haber dos apariciones y debes cambiar ambas).

Error LNK2001: unresolved external symbol InitCommonControls

No estás enlazando la librería comctl32.lib, en la cual está definida esta API. Esta librería no es incluída por default, por lo tanto necesitarás agregarla a las librerías en la línea de comando o agregarla en las especificaciónes de tu proyecto en VC++, en la parte de Link.

El Diálogo no es mostrado cuando se agregan ciertos controles

Los controles como ListView, TreeView, Hotkey, Progress Bar, entre otros, son clasificados como Controles Comunes (Common Controls) y son inlcuídos en la librería commctl32.dll y no están disponibles para versiones anterires de Windows 95. Los controles como BUTTON, EDIT, LISTBOX, etc... si bien parecen ser comunes, NO son "Controles Comunes" por lo que generalmente nos referimos a ellos como "Controles Estandar".

Si agregas un Common Control a un diálogo y éste falla al intentar mostrarlo, seguramente ha falle la llamada antes que ejecutes el diálogo . El mejor lugar para realizar esta llamada es en WinMain(). Si realizamos la llamada en WM_INITDIALOG, es demasiado tarde debido a que el diálogo fallará antes de que llegue a este punto y por lo tanto nunca será llamado.

Algunas personas y algunas documentaciones pueden decirte que InitCommonControls() está obsoleto y que debes usar InitCommonControlsEX(), pero eres libre de elegir, InitCommonControls() es mas simple y no hay nada malo en usarla.


Copyright © 1998-2003, Brook Miles (theForger). All rights reserved.

Versión en Español: FedericoPizarro - 2003