main para unicode [solucionado]

Iniciado por kworld, 1 Junio 2010, 11:40 AM

0 Miembros y 1 Visitante están viendo este tema.

kworld

Hola, por favor ¿me podrían ayudar?

Estoy haciendo una aplicación de consola, y tengo un problema, quiero aceptar nombres unicode de los archivos, por si mi aplicación corre en algún windows en chino o algo así.

El asunto es que el main me da problemas:


#define UNICODE

#include <windows.h>
#include <stdio.h>

int main(int argc, TCHAR* argv[])
{
   
   if (argc == 2)
   {
      HANDLE archivo;
      int error;
     
      archivo = CreateFile(/*TEXT("texto.txt"),*/ argv[1],
                           GENERIC_READ,
                           FILE_SHARE_READ,
                           NULL, // Descriptor de seguridad por defecto
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL,
                           NULL);
     
      error = GetLastError();
      if (error != NO_ERROR) {
         printf("Error: %d\n", error);
      }
      else
      {
         puts("No error");
      }
   }
   else
   {
       puts("Use only one argument");
   }
   
   return 0;
     
}



Así como está al especificar el nombre de archivo siempre me da error 2 (ERROR_FILE_NOT_FOUND), en cambio si descomento en el código y utilizo un nombre de archivo fijo existente, en este caso: texto.txt no da error.

A mi parecer el main es el que me da problemas, ¿cómo declaro un main que acepte unicode en la entrada?

He probado usando la cmd.exe en modo unicode:
cmd /u

y al especificar un nombre de archivo existente me da error 123 (ERROR_INVALID_NAME)

Entonces pienso que el problema está en la definición del main.
¿Por favor, alguien me puede ayudar? Tengo todo el resto del código listo para trabajar en unicode, pero me falta el poder aceptar un nombre de archivo desde el main, en este caso argv[1]

Estoy compilando con gcc 3.4.2 (mingw) bajo el ide Dev-C++ 4.9

EI: juntando mensajes.

busqué más información y leí que mingw no acepta wmain, así es que escribí esto como parche basado en: http://msdn.microsoft.com/en-us/library/bb776391%28v=VS.85%29.aspx



#ifdef UNICODE
int main()
#else
int main(int argc, UCHAR* argv[])
#endif
{
    #ifdef UNICODE
    TCHAR** argv;
    int argc;
    argv = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (argv == NULL) {
      return ERROR_DESCONOCIDO;
    }
    #endif

    int ret;
    ret = mi_funcion(argv[1]);

    #ifdef UNICODE
    LocalFree(argv);
    #endif

    return ret;
}