Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Version e Infoprmacion de cualquier ejecutable

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Version e Infoprmacion de cualquier ejecutable Responder citando

Cordial Saludo:

https://cppbuilder.es/viewtopic.php?p=16995#16995

He probado el enlace anterior y me sirve a mi aplicación.. pero, para cualquier otro ejecutable, ¿cómo lo hago?

Gracias
_________________
Please Response to:joseluisbz@bigfoot.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Prueba la siguiente función:
Código:
// #include <vector>
String GetFileVersion(String file,  // Nombre del archivo con path incluido
    String key = "FileVersion")     // Que información solicitamos (opcional)
{
    String ver = "(null)";
    DWORD size = GetFileVersionInfoSize(file.c_str(), 0);
    if (size > 0)
    {
        std::vector<char> buffer(size);
        if (GetFileVersionInfo(file.c_str(), 0, size, &buffer[0]))
        {
            UINT   datasize;
            struct {WORD lang, page;} *translation;

            VerQueryValue(&buffer[0], "\\VarFileInfo\\Translation",
                reinterpret_cast<PVOID*>(&translation), &datasize);

            String query;
            query.sprintf("\\StringFileInfo\\%04X%04X\\%s",
                translation->lang, translation->page, key.c_str());

            PCHAR data;
            if (VerQueryValue(&buffer[0], query.c_str(),
                reinterpret_cast<PVOID*>(&data), &datasize))
            {
                ver = data;
            }
        }
    }
    return ver;
}


* Ejemplos de uso:
Código:
// Obtenemos el número de versión de la aplicación que estamos ejecutando:
Caption = GetFileVersion(Application->ExeName);

// La versión de otra aplicación
String version = GetFileVersion("C:\\windows\\notepad.exe");

// Nombre de la compañia:
version = GetFileVersion("C:\\windows\\notepad.exe", "CompanyName");

Otros valores que podemos usar como segundo argumento:
    CompanyName, FileDescription, InternalName, LegalCopyright,
    OriginalFilename, ProductName, ProductVersion, etc...
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias, LEO

PCHAR me imagino que lo reconoce como pascal...
_________________
Please Response to:joseluisbz@bigfoot.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Esta definido en las cabeceras de Windows, aunque si, el PChar de Delphi y este son lo mismo, o sea un "char*":

[Windows Data Types (Windows API reference]
http://msdn.microsoft.com/en-us/library/aa383751.aspx
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdona Leo, pero esta función en Builder 2010 solo me devuelve el PRIMER Caracter de la información de Version.
Tendria que devolverme 7.0.54 pero solo me devuelve 7
He probado con "FileVersion"
La función la tengo definida asi en .cpp
Código:

// Para obtener informacion de archivos
String __fastcall GetFileVersion(String file,  // Nombre del archivo con path incluido
   String key)     // Que información solicitamos (opcional)
{
   String ver = "(null)";
   DWORD size = GetFileVersionInfoSize(file.w_str(), 0);
    if (size > 0)
    {
        std::vector<wchar_t> buffer(size);
        if (GetFileVersionInfo(file.w_str(), 0, size, &buffer[0]))
        {
         UINT   datasize;
            struct {WORD lang, page;} *translation;

         VerQueryValue(&buffer[0], L"\\VarFileInfo\\Translation",
                reinterpret_cast<PVOID>(&translation), &datasize);

         String query;
         query.sprintf(L"\\StringFileInfo\\%04X%04X\\%s",
                translation->lang, translation->page, key.w_str());

            PCHAR data;
            if (VerQueryValue(&buffer[0], query.w_str(),
                reinterpret_cast<PVOID>(&data), &datasize))
         {
                ver = data;
            }
      }
    }
    return ver;
}


La Cabecera:
Código:
String __fastcall GetFileVersion(String file, String key = "FileVersion");

y la llamada:
Código:
BtnVersion->Caption = "Versión: " + ::GetFileVersion(Application->ExeName);

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Me contesto yo mismo:
Lo he solucionado cambiando estal linea
Código:

PCHAR data;

por esta otra:
Código:

PWCHAR data;

Era de suponer ya que antes la funcion era AnsiString y ahora UnicodeString y se me habia olvidado el tipedef PCHAR que ahora debia de ser PWCHAR.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Por si le pasa a alguien más.

Al código de Jesús hay que añadirle (Builder XE) un par de inicadores de dirección.

En PVOID en realidad es PVOID*

Se los come al poner el estilo de código en el mensaje.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Dirección AIM
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.