[ 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