![]() |
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)
|
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. |
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:
Cita:
|
Veo los BeginUpdate... y los EndUpdate..., pero no veo por ningún sitio la llamada a UpdateResource.
|
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 |
Por favor, no olvides usar las etiquetas para código:
![]() |
Cambio FileVersion Ejecutable
Sabéis porque no cambia el FileVersion? Es lo único que no se modifica...
|
La franja horaria es GMT +2. Ahora son las 09:30:59. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi