只需配置您的项目,使其在每次新构建时自动递增版本号。这个
Version Info
“项目选项”页面中有一个用于此目的的复选框。
也就是说,在你展示的代码中,你不需要使用
StrAlloc()
/
StrDispose()
完全。只需通过
PChar(Arquivo)
作为输入
GetFileVersionInfoSize()
和
GetFileVersionInfo()
,并更改
Data
到a
array of Byte
(或
TBytes
如果你的Delphi版本有它)使用
SetLength()
分配它并让编译器自动释放它。
function GetVersao(const Arquivo: String): string;
type
PFFI = ^vs_FixedFileInfo;
var
F : PFFI;
Handle : Dword;
Len : Longint;
Data : array of Byte; // or TBytes
Buffer : Pointer;
Tamanho : Dword;
begin
Result := '';
Len := GetFileVersionInfoSize(PChar(Arquivo), Handle);
ShowMessage(IntToStr(Len));
if Len > 0 then
begin
SetLength(Data, Len);
if GetFileVersionInfo(PChar(Arquivo), Handle, Len, PByte(Data)) then
begin
if VerQueryValue(PByte(Data), '\', Buffer, Tamanho) then
begin
F := PFFI(Buffer);
Result := Format('%d.%d.%d.%d',
[HiWord(F^.dwFileVersionMs),
LoWord(F^.dwFileVersionMs),
HiWord(F^.dwFileVersionLs),
Loword(F^.dwFileVersionLs)]
);
end;
end;
end;
end;
function GetVersaoExe: string;
begin
Result := GetVersao(Application.ExeName);
end;
如果你真的想变得圆滑,你甚至不需要使用
GetFileVersionInfo/Size()
完全。您可以使用
(Find|Load|Lock)Resource()
访问调用进程的
RT_VERSION
直接使用资源:
function GetVersao(Module: THandle): string;
type
PFFI = ^vs_FixedFileInfo;
var
F : PFFI;
Len : Longint;
Data : array of Byte; // or TBytes
Buffer : Pointer;
Tamanho : Dword;
hRes, hResData: THandle;
begin
Result := '';
hRes := FindResource(Module, MAKEINTRESOURCE(1), RT_VERSION);
Len := SizeOfResource(hRes);
ShowMessage(IntToStr(Len));
if Len > 0 then
begin
hResData := LoadResource(Module, hRes);
Buffer := LockResource(hResData);
SetLength(Data, Len);
Move(Buffer^, Data[0], Len);
if VerQueryValue(PByte(Data), '\', Buffer, Tamanho) then
begin
F := PFFI(Buffer);
Result := Format('%d.%d.%d.%d',
[HiWord(F^.dwFileVersionMs),
LoWord(F^.dwFileVersionMs),
HiWord(F^.dwFileVersionLs),
Loword(F^.dwFileVersionLs)]
);
end;
end;
end;
function GetVersaoExe: string;
begin
Result := GetVersao(GetModuleHandle(nil));
end;