el argumento de tipo const char* es incompatible con el parámetro de tipo “LPCWSTR”

4 minutos de lectura

Estoy tratando de hacer un cuadro de mensaje simple en C en Visual Studio 2012, pero recibo los siguientes mensajes de error

argument of type const char* is incompatible with parameter of type "LPCWSTR"

err LNK2019:unresolved external symbol_main referenced in function_tmainCRTStartup

Aquí está el código fuente

#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBox(0,"Hello","Title",0);

    return(0);
}

Por favor ayuda

Gracias y saludos

  • Compruebe la configuración del conjunto de caracteres de su proyecto (Propiedades del proyecto, Propiedades de configuración, General, Conjunto de caracteres). Probablemente esté configurado en “Usar Unicode” en lugar de “Usar varios bytes”.

    – TipoIA

    17 de febrero de 2014 a las 16:56


  • Está ejecutando su código en un sistema operativo Unicode. Debe utilizar cadenas Unicode. Como L”Hola”. Puede hacer retroceder el reloj a 1991, pero no tiene mucho sentido usar C si lo hace.

    -Hans Passant

    17 de febrero de 2014 a las 17:04


  • @HansPassant o cambie a multibyte. La API de Windows es diseñado para permitirle usar uno o. Tenga en cuenta que las cadenas “multibyte” aún pueden codificar puntos de código Unicode, por lo que elegir esta opción no significa necesariamente “retroceder el reloj a 1991”. Las aplicaciones compatibles con Unicode, globalizadas y perfectamente correctas se pueden escribir utilizando cadenas de varios bytes (en lugar de caracteres anchos).

    – TipoIA

    17 de febrero de 2014 a las 17:05


  • No, el winapi está diseñado para soportar proyectos antiguos, que comenzaron en el siglo anterior. Crear uno nuevo y intencionalmente hacer que el código sea lento al obligar a las funciones de compatibilidad a convertir las cadenas tiene muy poco sentido. También podría usar un lenguaje de secuencias de comandos.

    -Hans Passant

    17 de febrero de 2014 a las 17:07

  • @HansPassant No. El mundo se ejecuta en UTF8, úselo como su representación interna para una fácil compatibilidad con el mundo, o tal vez use UCS4 si necesita un procesamiento de texto serio a nivel de caracteres. La codificación de 16 bits a medias del milenio anterior es una curiosidad interesante que debería permanecer en el museo de la informática antigua. La dependencia interna del sistema operativo Windows en esta codificación es un error, no una función. Una minúscula mejora de la velocidad no es una razón válida para admitir un error de este tipo en su propio código.

    – norte 1.8e9-dónde-está-mi-participación m.

    17 de febrero de 2014 a las 17:54

avatar de usuario
taza

Para hacer que su código se compile en ambos modos, encierre las cadenas en _T() y use los equivalentes de TCHAR

#include <tchar.h>
#include <windows.h>

int WINAPI _tWinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, LPTSTR lpszCmdLine, int nCmdShow)
{
    MessageBox(0,_T("Hello"),_T("Title"),0);
    return 0;
}

  • a través de su sugerencia, el argumento de tipo const char * se elimina

    usuario2341787

    17 de febrero de 2014 a las 18:49

  • pero aún muestra el externalsymbol_main no resuelto al que se hace referencia en function_tmainCRTStartup

    usuario2341787

    17/02/2014 a las 18:50

  • Se corrigió la parte winmain. Si consigue que Visual Studio cree el programa ficticio por usted, eso es lo que le dará.

    – taza

    17 de febrero de 2014 a las 18:58

Para compilar su código en Visual C++, necesita usar funciones WinAPI de caracteres de varios bytes en lugar de funciones de caracteres anchos.

Establecer proyecto -> Propiedades -> General -> Opción de juego de caracteres para usar juego de caracteres de varios bytes

Lo encontré aquí https://stackoverflow.com/a/33001454/5646315

  • ¡Respuesta muy útil!

    – céfiro

    18 oct 2017 a las 14:56

  • En Visual Studio 2019, esto ahora está asignado a: Proyecto -> Propiedades -> Avanzado -> Carácter -> Usar juego de caracteres de varios bytes

    – Cherona

    1 de marzo de 2021 a las 6:55

Recientemente me encontré con este problema e investigué un poco y pensé en documentar algo de lo que encontré aquí.

Para empezar, al llamar MessageBox(...)en realidad solo está llamando a una macro (por razones de compatibilidad con versiones anteriores) que está llamando a MessageBoxA(...) para codificación ANSI o MessageBoxW(...) para la codificación Unicode.

Entonces, si va a pasar una cadena ANSI con la configuración predeterminada del compilador en Visual Studio, puede llamar MessageBoxA(...) en lugar de:

#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBoxA(0,"Hello","Title",0);

    return(0);
}

Documentación completa para MessageBox(...) se encuentra aquí: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

Y para ampliar lo que dijo @cup en su respuesta, podría usar el _T() macro y seguir usando MessageBox():

#include<tchar.h>
#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBox(0,_T("Hello"),_T("Title"),0);

    return(0);
}

los _T() macro está haciendo que la cadena sea “juego de caracteres neutral”. Puede usar esto para configurar todas las cadenas como Unicode definiendo el símbolo _UNICODE antes de construir (documentación).

Espero que esta información te ayude a ti y a cualquier otra persona que tenga este problema.

avatar de usuario
GameDev99

Sí, sea lo que sea, fue un tutorial incorrecto, debe convertirlo en un número entero de bytes largos.

Prueba esto:

#include<Windows.h>
int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{
    MessageBox(0,L"Hello",L"Title",0);
    return(0);
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad