如何获取文件版本
编号:QA002570
建立日期: 2000年2月14日 最后修改日期:2000年2月14日
所属类别:
jhzhao:
编程工具: delphi4
操作系统: windows9x
近日在学习Delphi4时想使用API实现获取文件版本,但获取的版本总是不对,望予以解答。附:
Var
FullFileName : String;
lBufferLen : DWORD;
udtVerBuffer : VS_FIXEDFILEINFO;
lVerbufferLen : DWORD;
lVerPointer : Pointer;
lBufferPointer : Pointer;
lDummy : DWORD;
FileVersionMSl,FileVersionMSh,FileVersionLSl,FileVersionLSh : String;
begin
FullFileName:='C:\windows\Explorer.exe'; //版本号为:4.72.3110.1
lBufferLen:=GetFileVersionInfoSize(Pchar(FullFileName),lDummy);
If lBufferLen > 0 then
Begin
lBufferPointer:=nil; //不写此句即报错
GetFileVersionInfo(Pchar(FullFileName),$0,lBufferLen,lBufferPointer);
//此时lBufferPointer仍然为nil,可能错误在这里
VerQueryValue(lBufferPointer,'\',lVerPointer,lDummy);
MoveMemory(Addr(udtVerBuffer), lVerPointer, sizeof(udtVerBuffer));
FileVersionMSh:= Inttostr(hi(udtVerBuffer.dwProductVersionMS));
FileVersionMSl:= Inttostr(lo(udtVerBuffer.dwProductVersionMS));
FileVersionLSh:= Inttostr(hi(udtVerBuffer.dwProductVersionLS));
FileVersionLSl:= Inttostr(hi(udtVerBuffer.dwProductVersionLS));
label1.caption:=FileVersionMSh+'.'+FileVersionMSl+'.'+FileVersionLSh+'.'+FileVersionLSl;
//此处为:101.103.101.101
End;
end;
回答:
正如你所估计的,lBufferPointer是主要的错误。在调用GetFileVersionInfo之前,你必须分配一个缓冲区获得函数返回的版本信息。所以指定lBufferPointer为nil而没有传递缓冲区地址就无法获得版本信息。下面是一个正确的例子,你可以参考然后对你的程序进行修改:
procedure TForm1.Button1Click(Sender: TObject);
const
InfoNum = 10;
InfoStr : array [1..InfoNum] of String =
('CompanyName', 'FileDescription', 'FileVersion', 'InternalName',
'LegalCopyright', 'LegalTradeMarks', 'OriginalFilename',
'ProductName', 'ProductVersion', 'Comments');
var
S : String;
n, Len, i : Integer;
Buf : PChar;
Value : PChar;
begin
S := Application.ExeName;
n := GetFileVersionInfoSize(PChar(S),n);
if n > 0 then begin
Buf := AllocMem(n);
Memo1.Lines.Add('FileVersionInfoSize='+IntToStr(n));
GetFileVersionInfo(PChar(S),0,n,Buf);
for i:=1 to InfoNum do
if VerQueryValue(Buf,PChar('StringFileInfo\040904E4\'+
InfoStr[i]),Pointer(Value),Len) then
Memo1.Lines.Add(InfoStr[i]+'='+Value);
FreeMem(Buf,n);
end else
Memo1.Lines.Add('No FileVersionInfo found');
end;
相关问题:
QA001908 "如何获取文件的版本信息"
此问题由李海回答。
| |
|
|
| |
|
|