Versión del ejecutable

Post Reply
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Versión del ejecutable

Post by quique »

¿Como puedo obtener el número de versión del ejecutable que se le asigna en el RC y se muestra en las propiedades del archivo con click derecho del mouse?
Saludos
Quique
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: Versión del ejecutable

Post by Willi Quintana »

Hola,
En tu archivo de recursos, opción "New" hay una opción para crear la instancia "Versión", allí le asignas los datos que necesites....
Salu2
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Re: Versión del ejecutable

Post by quique »

Gracias Willi por responder, pero lo que necesito es obtener esa información desde el ejecutable, o sea, en el editor de recursos le pongo versión 1.0.0.2 ¿como obtengo ese dato dentro del ejecutable?
User avatar
MarioG
Posts: 1356
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Versión del ejecutable

Post by MarioG »

Quique;
Esto compartió, si mal no recuerdo Antonio.

Code: Select all

// Just for FWH 32 bits
// Author: Anonimo

#include "FiveWin.ch"

//----------------------------------------------------------------------------//
/*
function Main()

   local n

   for n = 1 to 12
       MsgInfo( GetFileVersionInfo( "filever.exe", n ) )
   next

return nil
*/
//----------------------------------------------------------------------------//

#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>

HB_FUNC( GETFILEVERSIONINFO )
{
   char * szFile  = hb_parc( 1 );
   UINT uAction   = ISNUM( 2 ) ? hb_parni( 2 ) : 1;
   DWORD dwHandle = 0;
   DWORD dwSize   = GetFileVersionInfoSize( szFile, &dwHandle );
   char * szOut   = NULL;
   BOOL  bOk      = FALSE;

   if( dwSize )
   {
      char * szBlock = ( char * ) hb_xgrab( 255 );
      char * szSubBlock = ( char * ) hb_xgrab( 255 );
      HGLOBAL hMem = GlobalAlloc( GMEM_MOVEABLE, dwSize );
      VS_FIXEDFILEINFO * vsInfo;
      UINT nLen = 0;

      if( hMem )
      {
         LPVOID pMem = GlobalLock( hMem );

         if( pMem && GetFileVersionInfo( szFile, dwHandle, dwSize, pMem ) )
         {
            if( VerQueryValue( pMem, "\\VarFileInfo\\Translation", ( LPVOID * ) &vsInfo, &nLen ) )
            {
               *( LPDWORD ) vsInfo = MAKELONG( HIWORD( *( LPDWORD ) vsInfo ), LOWORD( *( LPDWORD ) vsInfo ) );

               sprintf( szBlock, "\\StringFileInfo\\%08lx\\", *( LPDWORD )( vsInfo ) );

               switch( uAction )
               {
                  case 1:
                     sprintf( szSubBlock, "%s%s", szBlock, "Author" );
                     break;

                  case 2:
                     sprintf( szSubBlock, "%s%s", szBlock, "CompanyName" );
                     break;

                  case 3:
                     sprintf( szSubBlock, "%s%s", szBlock, "FileDescription" );
                     break;

                  case 4:
                     sprintf( szSubBlock, "%s%s", szBlock, "FileVersion" );
                     break;

                  case 5:
                     sprintf( szSubBlock, "%s%s", szBlock, "InternalName" );
                     break;

                  case 6:
                     sprintf( szSubBlock, "%s%s", szBlock, "LegalCopyright" );
                     break;

                  case 7:
                     sprintf( szSubBlock, "%s%s", szBlock, "LegalTrademarks" );
                     break;

                  case 8:
                     sprintf( szSubBlock, "%s%s", szBlock, "OriginalFilename" );
                     break;

                  case 9:
                     sprintf( szSubBlock, "%s%s", szBlock, "PrivateBuild" );
                     break;

                  case 10:
                     sprintf( szSubBlock, "%s%s", szBlock, "ProductName" );
                     break;

                  case 11:
                     sprintf( szSubBlock, "%s%s", szBlock, "ProductVersion" );
                     break;

                  case 12:
                     sprintf( szSubBlock, "%s%s", szBlock, "AppBuild" );
                     break;
               }

               if( VerQueryValue( pMem, szSubBlock, ( LPVOID * ) &szOut, &nLen ) )
                  bOk = TRUE;

               hb_xfree( szBlock );
               hb_xfree( szSubBlock );
            }

            GlobalUnlock( hMem );
            GlobalFree( hMem );
         }
      }
   }

   if( bOk )
      hb_retc( szOut );
   else
      hb_retc( "" );
}

#pragma ENDDUMP

//----------------------------------------------------------------------------//
 
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Re: Versión del ejecutable

Post by quique »

Gracias Mario, pero no funciona, de hecho ya la había visto pero volví a probar con lo que pusiste por si había cambios, de hecho tuve que modificar ISNUM por HB_ISNUM y me marcó dos warnings pero eso no lo toque.

En mi RC tengo

Code: Select all

1 VERSIONINFO
FILEVERSION 2, 4, 0, 1
PRODUCTVERSION 4, 2, 0, 0
FILEOS VOS__WINDOWS16
FILETYPE VFT_DLL
{
 BLOCK "StringFileInfo"
 
y al dar las propiedades del archivo me dice
Versión del archivo 2.4.0.1

Pero este número no aparece en ningún mensaje, ni siqueira separado como para decir hay que juntarlos, y de hecho, intenté cambiando el for de 0 a 20 por si acaso, pero nada.
Saludos
Quique
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Versión del ejecutable

Post by Antonio Linares »

Quique,

Revisa este código que encontré aqui:
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Code: Select all

BOOL GetAppVersion( char *LibName, WORD *MajorVersion, WORD *MinorVersion, WORD *BuildNumber, WORD *RevisionNumber )
{
 DWORD dwHandle, dwLen;
 UINT BufLen;
 LPTSTR lpData;
 VS_FIXEDFILEINFO *pFileInfo;
 dwLen = GetFileVersionInfoSize( LibName, &dwHandle );
 if (!dwLen) 
  return FALSE;

 lpData = (LPTSTR) malloc (dwLen);
 if (!lpData) 
  return FALSE;

 if( !GetFileVersionInfo( LibName, dwHandle, dwLen, lpData ) )
 {
  free (lpData);
  return FALSE;
 }
 if( VerQueryValue( lpData, "\\", (LPVOID *) &pFileInfo, (PUINT)&BufLen ) ) 
 {
  *MajorVersion = HIWORD(pFileInfo->dwFileVersionMS);
  *MinorVersion = LOWORD(pFileInfo->dwFileVersionMS);
  *BuildNumber = HIWORD(pFileInfo->dwFileVersionLS);
  *RevisionNumber = LOWORD(pFileInfo->dwFileVersionLS);
  free (lpData);
  return TRUE;
 }
 free (lpData);
 return FALSE;
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Versión del ejecutable

Post by FranciscoA »

Encontré esto. Talvez si alguien se decide "traducir" y lo prueba.

Code: Select all

'------------------------------------------------------------------------------
' Averiguar la versión de un fichero (ejecutable o DLL)             (24/Jun/08)
'
' ©Guillermo 'guille' Som, 2008
'------------------------------------------------------------------------------
Option Strict On

Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Imports System.Diagnostics

Public Class Form1

    Private Sub btnMostrar_Click(ByVal sender As Object, _
                                 ByVal e As EventArgs) _
                                 Handles btnMostrar.Click
        txtInfo.Text = FileVersion(txtFichero.Text)
    End Sub

    Private Sub btnExaminar_Click(ByVal sender As Object, _
                                  ByVal e As EventArgs) _
                                  Handles btnExaminar.Click
        Dim ofD As New OpenFileDialog

        With ofD
            .FileName = txtFichero.Text
            .Filter = "Ejecutables (*.exe; *.dll)|*.exe;*.dll"
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                txtFichero.Text = .FileName
            End If
        End With
    End Sub

    Private Function FileVersion(ByVal elPath As String) As String
        Dim fvi As System.Diagnostics.FileVersionInfo = _
                System.Diagnostics.FileVersionInfo.GetVersionInfo(elPath)
        'Return fvi.FileVersion
        'Return fvi.ProductVersion

        Dim sb As New System.Text.StringBuilder
        sb.AppendLine("ProductName:     " & fvi.ProductName)
        sb.AppendLine("FileDescription: " & fvi.FileDescription)
        sb.AppendLine("FileVersion:     " & fvi.FileVersion)
        sb.AppendLine("ProductVersion:  " & fvi.ProductVersion)
        sb.AppendLine("LegalCopyright:  " & fvi.LegalCopyright)

        Return sb.ToString
    End Function


    Private Sub Form1_Load(ByVal sender As Object, _
                           ByVal e As EventArgs) _
                           Handles MyBase.Load
        Dim ensamblado As System.Reflection.Assembly = _
                System.Reflection.Assembly.GetExecutingAssembly
        txtFichero.Items.Add(ensamblado.Location)

        txtFichero.Items.Add("E:\gsCodigo\Vb5_L\gsCalc\gsCalc.exe")
        txtFichero.Items.Add("C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll")
        txtFichero.Items.Add("C:\Windows\winhlp32.exe")
        txtFichero.Items.Add("C:\Windows\Microsoft.NET\Framework\v3.5\vbc.exe")
        txtFichero.Items.Add("C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe")

        txtFichero.SelectedIndex = 0
    End Sub


    Private Sub Form1_DragEnter(ByVal sender As Object, _
                                ByVal e As DragEventArgs) _
                                Handles MyBase.DragEnter, txtFichero.DragEnter
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub

    Private Sub Form1_DragDrop(ByVal sender As Object, _
                               ByVal e As DragEventArgs) _
                               Handles MyBase.DragDrop, txtFichero.DragDrop
        If e.Data.GetDataPresent("FileDrop") Then
            txtFichero.Text = CType(e.Data.GetData("FileDrop", True), String())(0)
        End If
    End Sub
End Class
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Re: Versión del ejecutable

Post by quique »

Antonio. Disculpa mi ignorancia en C pero ¿como lo puedo integrar a FW/harbour?

Francisco. Esperemos que alguien pueda, porque yo no pude :(
Saludos
Quique
User avatar
MarioG
Posts: 1356
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: Versión del ejecutable

Post by MarioG »

Quique;
Se me pasó comentarte que la función la uso con xHarbour Harbour Compiler build 1.2.1 (SimpLex) (Rev. 9421) y FWH 12.04

Ahora bien lo acabo de compilar (sin tocar nada porque de C desconozco) con Harbour 3.2.0dev (r1406161338) y FWH 12.04
y solo me sale el siguiente warning:
--------------------Configuración: pru32 - Debug--------------------
Harbour 3.2.0dev (r1406161338)
Copyright (c) 1999-2014, http://harbour-project.org/
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
FileVer.c:
Warning W8075 d:\\MIHARB~1\\TEmege\\Sources\\FileVer.prg 27: Suspicious pointer conversion in function HB_FUN_GETFILEVERSIONINFO
Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland
filever.exe - 0 error(es), 1 advertencia(s)

Por lo que me muestra versión y demás
Quizás si uds. saben me puedan indicar como evitar este warning

Haciendo boton derecho sobre el icono del ejecutable e ingresando en Detalle (W7) obviamente tambien se lee los datos enviados
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Versión del ejecutable

Post by karinha »

Code: Select all

1 VERSIONINFO LOADONCALL MOVEABLE DISCARDABLE IMPURE
FILEVERSION 1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x0
FILEFLAGS 0x0
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
{
 BLOCK "StringFileInfo"
 {
  BLOCK "040904E4"
  {
   VALUE "Comments",    "Sistema Desenvolvido Pela Empresa TAL - http://www.empresatal.com.br \0"
   VALUE "CompanyName",   "Sistema Desenvolvido Pela Empresa TAL - http://www.empresatal.com.br \0"
   VALUE "FileDescription", "NOMBRE DEL SISTEMA\0"
   VALUE "FileVersion",   "1.0000\0"
   VALUE "InternalName",  "Proyecto TAL\0"
   VALUE "LegalCopyright", "Empresa Informática Ltda\0"
   VALUE "LegalTrademarks", "NOMBRE SISTEMA / SISTEMA\0"
   VALUE "OriginalFilename", "NOMBRE_EXE.EXE\0"
   VALUE "ProductName",   "NOMBRE DEL SISTEMA\0"
   VALUE "ProductVersion", "1.0000\0"
  }
 }
 BLOCK "VarFileInfo"
 {
  VALUE "Translation", 0x416, 0x4B0
 }
}
 
João Santos - São Paulo - Brasil
Post Reply