Ver Mensaje Individual
  #3  
Antiguo 26-10-2023
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

Sí; utilizando la siguiente función, si bien, probándola, he visto que todo parece ir bien excepto el "FileVersion"... parece que esa "clave" en particular no se cambia y no sé bien porqué ahora mismo... en fin... espero que te pueda servir.

Código Delphi [-]
(*
  Important about this method:

  This method can update the executable version information WHICH IS ALREADY
  SET FROM THE EXECUTABLE'S PROJECT'S OPTIONS!!!!

  What we do is to set a dummy 255 empties characters in every version
  information key, so, we can update it here up to 255 characters that keys.

  This is the only way in which we get this working!!
*)
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;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita