Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2023
javier14 javier14 is offline
Miembro
 
Registrado: ago 2023
Posts: 12
Poder: 0
javier14 Va por buen camino
Cambiar Versión Ejecutable

Necesito un procedimiento que pasado un archivo ejecutable por parámetro le cambie el FILE VERSION. (No es cambiar la versión en el programa que estoy, sino en otro ejecutable)
Responder Con Cita
  #2  
Antiguo 26-10-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Para obtener la información del ejecutable puedes empezar por las APIs: GetFileVersionInfoand VerQueryValue (esta información puedes obtenerla de la wiki de embarcadero https://docwiki.embarcadero.com/RADS...n/Version_Info).

Para actualizarlo con el nuevo valor, revisa las APIs, BeginUpdateResource, UpdateResource y EndUpdateResource.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 26-10-2023
javier14 javier14 is offline
Miembro
 
Registrado: ago 2023
Posts: 12
Poder: 0
javier14 Va por buen camino
Código Delphi [-]
function FileVersionToInteger(const version: string): Integer;
var
  parts: TArray<string>;
  i, factor: Integer;
begin
  parts := version.Split(['.']);
  Result := 0;
  factor := 1;
  for i := High(parts) downto Low(parts) do
  begin
    Result := Result + StrToInt(parts[i]) * factor;
    factor := factor * 1000;
  end;
end;

procedure TForm1.CambiarVersionArchivo(const nombreArchivo: string;
  nuevaVersion: string);
var
  info: VS_FIXEDFILEINFO;
  handle, len: DWORD;
  datos, ptr: PChar;
  errorCode : DWORD;
begin
  nuevaVersion := nuevaVersion.Replace('.', '');
  nuevaVersion := nuevaVersion.PadRight(4, '0');
  nuevaVersion := nuevaVersion.PadLeft(8, '0');
  var nuevaVersionInt := FileVersionToInteger(nuevaVersion);

  handle := BeginUpdateResource(PChar(nombreArchivo), False);
  if handle = 0 then
    RaiseLastOSError;

  len := GetFileVersionInfoSize(PChar(nombreArchivo), handle);
  if len = 0 then
  begin
    EndUpdateResource(handle, False);
    RaiseLastOSError;
  end;

  datos := AllocMem(len);
  try
    if not GetFileVersionInfo(PChar(nombreArchivo), handle, len, datos) then
    begin
      EndUpdateResource(handle, False);
      RaiseLastOSError;
    end;

    if VerQueryValue(datos, '\', Pointer(ptr), len) then
    begin
      Move(ptr^, info, sizeof(info));

      info.dwFileVersionMS := nuevaVersionInt;
      info.dwFileVersionLS := nuevaVersionInt;

      Move(info, ptr^, sizeof(info));
    end
    else
    begin
      errorCode := GetLastError;
      ShowMessage('VerQueryValue Error: ' + IntToStr(errorCode));
      EndUpdateResource(handle, False);
      RaiseLastOSError;
    end;

    if not EndUpdateResource(handle, False) then
    begin
      errorCode := GetLastError;
      ShowMessage('EndUpdateResource Error: ' + IntToStr(errorCode));
      RaiseLastOSError;
    end;
  finally
    FreeMem(datos);
  end;
end;

Lo llamo en el OnClick del botón:
CambiarVersionArchivo('C:\Users\javier\myfile.exe', '6.7.8.9');

Pero me salen los errores:

Primero:

Cita:
· ShowMessage: EndUpdateResource Error: 87
Segundo:

Cita:
· Excepción: A call to an OS function failed
¿ Qué puede pasar ?

Última edición por dec fecha: 26-10-2023 a las 11:15:36. Razón: Poner etiquetas DELPHI y QUOTE
Responder Con Cita
  #4  
Antiguo 26-10-2023
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Veo los BeginUpdate... y los EndUpdate..., pero no veo por ningún sitio la llamada a UpdateResource.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 26-10-2023
javier14 javier14 is offline
Miembro
 
Registrado: ago 2023
Posts: 12
Poder: 0
javier14 Va por buen camino
procedure TForm1.CambiarVersionArchivo(const nombreArchivo: string;
nuevaVersion: string);
var
info: VS_FIXEDFILEINFO;
handle, len: DWORD;
datos, ptr: PChar;
errorCode: DWORD;
nuevaVersionInt: Integer;
begin
nuevaVersion := nuevaVersion.Replace('.', '');
nuevaVersion := nuevaVersion.PadRight(4, '0');
nuevaVersion := nuevaVersion.PadLeft(8, '0');
nuevaVersionInt := FileVersionToInteger(nuevaVersion);

handle := BeginUpdateResource(PChar(nombreArchivo), False);
if handle = 0 then
RaiseLastOSError;

len := GetFileVersionInfoSize(PChar(nombreArchivo), handle);
if len = 0 then
begin
EndUpdateResource(handle, False);
RaiseLastOSError;
end;

datos := AllocMem(len);
try
if not GetFileVersionInfo(PChar(nombreArchivo), handle, len, datos) then
begin
EndUpdateResource(handle, False);
RaiseLastOSError;
end;

if VerQueryValue(datos, '\', Pointer(ptr), len) then
begin
Move(ptr^, info, SizeOf(info));

info.dwFileVersionMS := nuevaVersionInt;
info.dwFileVersionLS := nuevaVersionInt;

if not UpdateResource(handle, RT_VERSION, PChar(1), 0, datos, len) then
begin
errorCode := GetLastError;
ShowMessage('UpdateResource Error: ' + IntToStr(errorCode));
EndUpdateResource(handle, False);
RaiseLastOSError;
end;
end
else
begin
errorCode := GetLastError;
ShowMessage('VerQueryValue Error: ' + IntToStr(errorCode));
EndUpdateResource(handle, False);
RaiseLastOSError;
end;

if not EndUpdateResource(handle, False) then
begin
errorCode := GetLastError;
ShowMessage('EndUpdateResource Error: ' + IntToStr(errorCode));
RaiseLastOSError;
end;
finally
FreeMem(datos);
end;
end;

Algo asi? No termina de funcionar pero debe ser algo por el estilo
Responder Con Cita
  #6  
Antiguo 26-10-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por favor, no olvides usar las etiquetas para código:
Responder Con Cita
  #7  
Antiguo 30-10-2023
javier14 javier14 is offline
Miembro
 
Registrado: ago 2023
Posts: 12
Poder: 0
javier14 Va por buen camino
Cambio FileVersion Ejecutable

Sabéis porque no cambia el FileVersion? Es lo único que no se modifica...

Código Delphi [-]
function UpdateExeInfo(const ExePath, CompanyName, FileDescription,
     FileVersion, InternalName, LegalCopyright, LegalTrademarks, OriginalFileName,
      ProgramID, ProductName, ProductVersion, Comments: string): Boolean;
type
  PLangAndCodePage = ^TLangAndCodePage;
  TLangAndCodePage = packed record
    wLanguage: Word;
    wCodePage: Word;
  end;
var
  Size, Unused: DWORD;
  VerData: PByte;
  Value: Pointer;
  Len, VerLen, I: UINT;
  Translate: PLangAndCodePage;
  KeyName: WideString;
  AFileVersion: LPWSTR;
  hUpdate: THandle;
  Updated: BOOL;
begin
  Result := False;
  if not FileExists(ExePath) then
    Exit;

  Size := GetFileVersionInfoSize(PChar(ExePath), Unused);
  if Size <> 0 then
  begin
    GetMem(VerData, Size);
    try
      if GetFileVersionInfo(PChar(ExePath), 0, Size, VerData) then
      begin
        Value := nil;
        Len := 0;
        VerQueryValue(VerData, '\', Value, Len);

        Value := nil;
        Len := 0;
        VerQueryValue(VerData, '\VarFileInfo\Translation', Value, Len);

        Translate := PLangAndCodePage(Value);
        for I := 0 to (Len div SizeOf(TLangAndCodePage)) - 1 do
        begin

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'CompanyName';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(CompanyName));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'FileDescription';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(FileDescription));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'FileVersion';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(FileVersion));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'InternalName';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(InternalName));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'LegalCopyright';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(LegalCopyright));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'LegalTrademarks';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(LegalTrademarks));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'OriginalFileName';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(OriginalFileName));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'ProgramID';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(ProgramID));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'ProductName';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(ProductName));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'ProductVersion';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(ProductVersion));
          end;

          KeyName := '\StringFileInfo\' + IntToHex(Translate^.wLanguage, 4) +
            IntToHex(Translate^.wCodePage, 4) + '\' + 'Comments';
          Value := nil;
          VerLen := 0;
          if VerQueryValueW(VerData, PWideChar(KeyName), Value, VerLen) then
          begin
            AFileVersion := PWideChar(Value);
            ZeroMemory(AFileVersion, VerLen * SizeOf(WideChar));
            wsprintfW(AFileVersion, PWideChar(Comments));
          end;

          Inc(Translate);
        end;

        hUpdate := BeginUpdateResource(PChar(ExePath), False);
        if hUpdate <> 0 then
        begin
          Updated := UpdateResource(hUpdate, RT_VERSION,
            MAKEINTRESOURCE(VS_VERSION_INFO), MAKELANGID(LANG_NEUTRAL,
            SUBLANG_NEUTRAL), VerData, Size);
          EndUpdateResource(hUpdate, not Updated);
        end;
      end;
    finally
      FreeMem(VerData);
    end;
  end;
end;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cambiar datos (en runtime) de la versión de un ejecutable dec API de Windows 4 26-10-2023 17:40:24
Saber la versión de un ejecutable MAXIUM API de Windows 2 23-08-2014 04:04:59
Obtener la versión del ejecutable de una aplicación dec Trucos 1 20-02-2009 09:30:31
como puedo hacer para cambiar un archivo de excel con versión 2.1 a versión 8.0 RONPABLO Servers 4 23-01-2006 06:02:38
Leer versión de un archivo ejecutable FerPetrei Windows 2 16-01-2004 20:41:42


La franja horaria es GMT +2. Ahora son las 16:04:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi