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 ?