CreateFile con nombres de ruta de Asia oriental falla con una ruta de volumen inválida o nombre de archivo -- windows camp Relacionados El problema

CreateFile with East Asian Path Names Fails with Invalid Volume Path or FileName


1
vote

problema

Español
  1. Tengo una aplicación heredada que se ejecuta en Windows con lugar local en Korea (Hangul)
  2. He creado una envoltura GDIPLUS C ++ para la compresión de la imagen (PNG, JPG, etc.) para usar en la aplicación heredada.
  3. La aplicación tiene 2 procesos A y B. Proceso B es un hijo de a.
  4. El proceso B genera un mapa de bits y se comprime a través de la envoltura: bitmap- & gt; Guardar (Hangul-file-Name.png).
  5. Procesar un intento de abrir Hangul-file-Name.png y falla con el código de error 123 (volumen, ruta o nombre de archivo no válido).
  6. ¿Cuál es la API de la victoria utilizada por bitmap- & gt; guardar () que le permite crear con éxito hangul-file-name.png? pensaría que el bitmap- & gt; guardar () eventualmente debe llamar a CreateFile () ??
  7. ¿Hay banderas que pueda agregar al FREEFILE () que resolvería este problema?

  // Called from legacy application.  //  pszFileName - contains a DBCS ANSI Hangul path name "자동연결기능수행_(perform_autolink_functions)_ffbd"  volume info left out. BOOL SavePng(char * pszFileName, HBITMAP bmhandle, HPALETTE palette, int quality) {     if(pszFileName == NULL)         return FALSE;     // Convert the smalltalk DBCS  ANSI string to unicode.     int slength = strlen(pszFileName);     wchar_t *uFilename = new wchar_t[slength + 1];     uFilename[slength] = L'';     MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, uFilename, slength);      BOOL result = SaveImage(uFilename, L"image/png", bmhandle, palette, quality);     delete uFilename;     return result; }  // Create a compressed image file BOOL SaveImage(LPCWSTR pszFileName, LPCWSTR encoding, HBITMAP bmhandle, HPALETTE palette, int quality) {     CLSID encoderClsid;     if( GetEncoderClsid(encoding, &encoderClsid) > 0)     {         EncoderParameters encoderParameters;         encoderParameters.Count = 1;         encoderParameters.Parameter[0].Guid = EncoderQuality;         encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;         encoderParameters.Parameter[0].NumberOfValues = 1;         encoderParameters.Parameter[0].Value = &quality;         Bitmap* bm = new Bitmap(bmhandle, palette);         bm->Save(pszFileName,&encoderClsid, &encoderParameters);         delete bm;         return TRUE;     }     return FALSE; }  // Attempt to open file for reading //  pszFileName: "C:CORE2net80usersAdministrator자동연결기능수행_(perform_autolink_functions).png" (sample) HANDLE OpenReadOnly(char * pszFileName) {     // Convert the smalltalk DBCS ansi string to unicode.     int slength = strlen(pszFileName);      int lenw = MultiByteToWideChar(CP_ACP, 0, pszFileName, slength, 0, 0);     if(lenw > 0)     {         wchar_t *uFilename = new wchar_t[lenw + 1];         uFilename[lenw] = L'';          MultiByteToWideChar(CP_ACP, 0, pszFileName, slength, uFilename, lenw);          HANDLE h = CreateFile(uFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);         if( h ==  INVALID_HANDLE_VALUE)         {             DWORD en = GetLastError(); // Error 123 (volume, path or filename invalid)             return 0;         }         return h;     }     return 0; }   
Original en ingles
  1. I have a legacy application running on Windows with locale set to Korea (Hangul)
  2. I created a GDIPLUS C++ wrapper for image compression (png, jpg,etc) to use in the legacy App.
  3. The application has 2 processes A and B. Process B is a child of A.
  4. Process B generates a bitmap and compresses it via the wrapper: Bitmap->Save(Hangul-file-name.png).
  5. Process A attempts to open Hangul-file-name.png and fails with error code 123 (volume, path or filename invalid).
  6. What is the WIN API used by Bitmap->Save() that enables it to successfully create Hangul-file-name.png? I would think that the Bitmap->Save() must eventually call CreateFile()??
  7. Are there any flags I can add to the CreateFile() that would resolve this problem?

// Called from legacy application.  //  pszFileName - contains a DBCS ANSI Hangul path name "xecx9ex90xebx8fx99xecx97xb0xeaxb2xb0xeaxb8xb0xebx8axa5xecx88x98xedx96x89_(perform_autolink_functions)_ffbd"  volume info left out. BOOL SavePng(char * pszFileName, HBITMAP bmhandle, HPALETTE palette, int quality) {     if(pszFileName == NULL)         return FALSE;     // Convert the smalltalk DBCS  ANSI string to unicode.     int slength = strlen(pszFileName);     wchar_t *uFilename = new wchar_t[slength + 1];     uFilename[slength] = L'\0';     MultiByteToWideChar(CP_ACP, 0, pszFileName, -1, uFilename, slength);      BOOL result = SaveImage(uFilename, L"image/png", bmhandle, palette, quality);     delete uFilename;     return result; }  // Create a compressed image file BOOL SaveImage(LPCWSTR pszFileName, LPCWSTR encoding, HBITMAP bmhandle, HPALETTE palette, int quality) {     CLSID encoderClsid;     if( GetEncoderClsid(encoding, &encoderClsid) > 0)     {         EncoderParameters encoderParameters;         encoderParameters.Count = 1;         encoderParameters.Parameter[0].Guid = EncoderQuality;         encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;         encoderParameters.Parameter[0].NumberOfValues = 1;         encoderParameters.Parameter[0].Value = &quality;         Bitmap* bm = new Bitmap(bmhandle, palette);         bm->Save(pszFileName,&encoderClsid, &encoderParameters);         delete bm;         return TRUE;     }     return FALSE; }  // Attempt to open file for reading //  pszFileName: "C:\CORE2net80\users\Administrator\xecx9ex90xebx8fx99xecx97xb0xeaxb2xb0xeaxb8xb0xebx8axa5xecx88x98xedx96x89_(perform_autolink_functions).png" (sample) HANDLE OpenReadOnly(char * pszFileName) {     // Convert the smalltalk DBCS ansi string to unicode.     int slength = strlen(pszFileName);      int lenw = MultiByteToWideChar(CP_ACP, 0, pszFileName, slength, 0, 0);     if(lenw > 0)     {         wchar_t *uFilename = new wchar_t[lenw + 1];         uFilename[lenw] = L'\0';          MultiByteToWideChar(CP_ACP, 0, pszFileName, slength, uFilename, lenw);          HANDLE h = CreateFile(uFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);         if( h ==  INVALID_HANDLE_VALUE)         {             DWORD en = GetLastError(); // Error 123 (volume, path or filename invalid)             return 0;         }         return h;     }     return 0; } 
  
 
 

Lista de respuestas

0
 
vote

No hay magia. Bitmap->Save() Llamará finalmente CreateFileW (la versión de Unicode de public decimal Value1 { get { return (decimal)GetValue(Value1Property); } set { SetValue(Value1Property, value); } } public static readonly DependencyProperty Value1Property = DependencyProperty.Register("Value1", typeof(decimal), typeof(MyVM), new PropertyMetadata(0m, (d, e) => { var vm = d as MyVM; vm.TotalValue = e.NewValue + vm.Value2; })); public decimal Value2 { get { return (decimal)GetValue(Value2Property); } set { SetValue(Value2Property, value); } } public static readonly DependencyProperty Value2Property = DependencyProperty.Register("Value2", typeof(decimal), typeof(MyVM), new PropertyMetadata(0m, (d, e) => { var vm = d as MyVM; vm.TotalValue = e.NewValue + vm.Value1; })); 0 ).

Usted tiene código para convertir el nombre de archivo MBCS en Unicode en ambos public decimal Value1 { get { return (decimal)GetValue(Value1Property); } set { SetValue(Value1Property, value); } } public static readonly DependencyProperty Value1Property = DependencyProperty.Register("Value1", typeof(decimal), typeof(MyVM), new PropertyMetadata(0m, (d, e) => { var vm = d as MyVM; vm.TotalValue = e.NewValue + vm.Value2; })); public decimal Value2 { get { return (decimal)GetValue(Value2Property); } set { SetValue(Value2Property, value); } } public static readonly DependencyProperty Value2Property = DependencyProperty.Register("Value2", typeof(decimal), typeof(MyVM), new PropertyMetadata(0m, (d, e) => { var vm = d as MyVM; vm.TotalValue = e.NewValue + vm.Value1; })); 1111 y public decimal Value1 { get { return (decimal)GetValue(Value1Property); } set { SetValue(Value1Property, value); } } public static readonly DependencyProperty Value1Property = DependencyProperty.Register("Value1", typeof(decimal), typeof(MyVM), new PropertyMetadata(0m, (d, e) => { var vm = d as MyVM; vm.TotalValue = e.NewValue + vm.Value2; })); public decimal Value2 { get { return (decimal)GetValue(Value2Property); } set { SetValue(Value2Property, value); } } public static readonly DependencyProperty Value2Property = DependencyProperty.Register("Value2", typeof(decimal), typeof(MyVM), new PropertyMetadata(0m, (d, e) => { var vm = d as MyVM; vm.TotalValue = e.NewValue + vm.Value1; })); 2 , y no funciona igual. Cree una sola función para realizar la conversión del nombre de archivo y debe obtener resultados consistentes.

 

There isn't any magic. Bitmap->Save() will eventually call CreateFileW (the Unicode version of CreateFile).

You have code for converting the MBCS filename into Unicode in both SavePng and OpenReadOnly, and it doesn't work the same. Create a single function to do the filename conversion and you should get consistent results.

 
 

Relacionados problema

39  Archivos de ayuda de Windows - ¿Cuáles son las opciones?  ( Windows help files what are the options ) 
De nuevo en los viejos tiempos, la ayuda no era trivial pero es posible: generar un archivo Funky .RTF con etiquetas especiales, ejecútelo a través de un comp...

20  Proyecto de configuración de Visual Studio - por Configuración del Registro de usuarios  ( Visual studio setup project per user registry settings ) 
Estoy tratando de mantener un proyecto de configuración en Visual Studio 2003 (Sí, es una aplicación heredada). El problema que tenemos en este momento es q...

21  Linux Shell equivalente en IIS  ( Linux shell equivalent on iis ) 
Como desarrollador de lámparas, considerando mudarse a una plataforma .NET IIS, una de mis inquietudes es la pérdida de productividad debido a la falta de she...

38  ¿Qué es una mejor alternativa de copia de archivo que el valor predeterminado de Windows? [cerrado]  ( What is a better file copy alternative than the windows default ) 
cerrado. Esta pregunta es off-topic . Actualmente no está aceptando respuestas. CERRADO 9 años . ...

49  Obtener una vista previa JPEG de un PDF en Windows?  ( Get a preview jpeg of a pdf on windows ) 
Tengo una aplicación multiplataforma (Python) que necesita generar una vista previa de JPEG de la primera página de un PDF. en la Mac estoy desplazando SIP...

64  Montón de corrupción bajo Win32; ¿Cómo localizar?  ( Heap corruption under win32 how to locate ) 
Estoy trabajando en una aplicación de MultiShreaded que está corrompiendo el montón. Las herramientas habituales para localizar esta corrupción parecen ser ...

56  ¿La mejor manera de acceder a Exchange usando PHP?  ( Best way to access exchange using php ) 
Estoy escribiendo una aplicación CMS en PHP y uno de los requisitos es que debe poder interactuar con el servidor de Exchange del cliente. He escrito esta fun...

48  Los mejores clientes de subversión para Windows Vista (64bit) [CERRADO]  ( Best subversion clients for windows vista 64bit ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

39  Registre el programa Windows con el protocolo de correo por correo electrónico  ( Register windows program with the mailto protocol programmatically ) 
¿Cómo lo hago, así que mailto: enlaces se registrarán con mi programa? ¿Cómo manejaría entonces ese evento en mi programa? La mayoría de las soluciones ...

63  Embeding Windows Media Player para todos los navegadores  ( Embedding windows media player for all browsers ) 
Editar: Esta pregunta fue escrita en 2008, que fue como 3 años de internet. Si esta pregunta sigue siendo relevante para su entorno, acepte mis condolencias...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos