Tengo una versión de los recursos en mis recursos en un proyecto de C++ que contiene el número de versión, el derecho de autor y los detalles de la compilación. Hay una manera fácil de acceder a este en tiempo de ejecución para rellenar mi ayuda/acerca de de diálogo como actualmente estoy manteniendo separados const valores de esta información. Idealmente, la solución debe trabajar para Windows/CE móviles y versiones anteriores de Visual C++ (6.0 en adelante).

  • Debe tener en cuenta que el uso de _get_pgmptr() o _get_wpgmptr() es mejor que GetModuleFileName(NULL, szFilename, MAX_PATH); guarda innecesario asignación y aclarar su intención.
InformationsquelleAutor SmacL | 2008-11-25

7 Comentarios

  1. 33

    Esta es una versión editada de mi respuesta original.

    • ¿Dónde se encuentra el IDENTIFICADOR de idioma?
    • Me gustaría empezar en la página de MSDN Identificador de Idioma de Cadenas y Constantes.
    • Tanto en sus dos últimas líneas me da un 'void ATL::CSimpleStringT<char,false>::SetString(const char *,int)' : cannot convert argument 1 from 'LPCTSTR' to 'const char *'.. He #include <atlstr.h>
    • uso LPCSTR en lugar de eso, lo siento.
    • En el ejemplo de la VerQueryValue documentación utiliza VerQueryValue con lpSubBlock = _T("\\VarFileInfo\\Translation") para obtener la información de la traducción.
    • Completa identificador de idioma de la tabla se puede encontrar aquí. 040904e4 es equivalente a 0409=NOSOTROS y 04e4=multilingüe charset (decimal 1252)
    • Este Código tiene un error. VerQueryValue devuelve la longitud de la cadena de incluye la terminación de cero. SetString agrega la terminación de cero a la cadena. Esto conduce a un comportamiento inesperado. Si usted anexar sth. a decir strProductName parece que no pasó nada, porque hay ahora es un cero en la mitad de la cuerda. Las funciones que toman una cadena terminada en cero que va a tomar sólo la parte del nombre del producto. Debe ser: strProductName.SetString((LPCSTR)pvProductName, iProductNameLen -1 ); o strProductName.SetString((LPCSTR)pvProductName);.
    • eso no es en absoluto evidente de la lectura de la documentación, el código ya no está a mi disposición para la prueba. Yo no presumiría de hacer que la corrección sin necesidad de pruebas.
    • Hay que son perfectamente correctas. No se muy bien documentado. Yo estaba tratando de encontrar, ¿por qué mi concatenación de cadenas no funciona. Estaba en un lugar completamente diferente en el código. Por último, me remonta a la VerQueryValue función. No se le ocurrió a mí que podría ser un adicional de cero en la cadena de datos. Tapizados y voila funcionó. Tal vez usted acaba de poner una pista en la solución para pedir a la gente a mirar a mi comentario. Si usted sólo tiene que utilizar la cadena por sí mismo usted podría no notar la diferencia. Tan pronto como usted += otra cadena o el uso de la + operador el síntoma muestra.
    • funciona bajo WinCE (Windows Embedded Compact) de 2013 a la perfección. Gracias.
    • Cuando lo probé, yo soy capaz de obtener sólo el primer carácter. Traté de depuración utilizando Visual studio.

  2. 14

    Para obtener un lenguaje independiente resultado para Marcar la respuesta de cambio :

    A

    • gracias, esto es muy interesante, gran solución!
    • Este obtiene información diferente de la Marca de Rescate de la respuesta. Los valores que recuperar son cuatro enteros de la PRODUCTVERSION de nivel superior de la línea en el archivo de recursos; sin embargo, las Marcas’ respuesta recupera la cadena «ProductVersion» bajo el «StringFileInfo» del bloque.
  3. 4

    ¡Cuidado!
    El uso de FindResource..LockResource no es correcto. A veces va a trabajar (como lo hizo en mi pequeña demo del programa) y a veces a causa de infracciones de acceso (ejemplo: el código de la producción estaba haciendo la demo).

    La VerQueryValue() estados de documentación que debe llamar GetFileVersionInfoSize y GetFileVersionInfo lugar.
    Raymond Chen explica, ver http://blogs.msdn.com/oldnewthing/archive/2006/12/26/1365215.aspx

  4. 0

    Ok, un poco más googleing encontrado el siguiente en CodeGuru. Básicamente, este enfoque utiliza la CFileVersionInfo objeto de obtener en cualquier archivo. Debe ser interesante ver si funciona en la actualidad en ejecución .Archivo EXE y en Windows CE.

  5. 0

    A veces voy a recibir una Infracción de Acceso cuando uso VerQueryValueA. Pero nunca tuve este error cuando uso VerQueryValueW. Creo que algo anda mal con VerQueryValueA en version.dll. Por lo tanto, yo uso VerQueryValueW en lugar de VerQueryValueA incluso en proyectos Multi-Codificación de Caracteres de byte. Aquí está mi código de ReadVersion función

Dejar respuesta

Please enter your comment!
Please enter your name here