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
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
  #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.289
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
  #3  
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
  #4  
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.055
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
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 11:35:01.


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