我想用GetFileVersionInfo函数来获取.exe或者.dll的版本信息,可是试验发现只能获得delphi编译出来的程序的版本信息,其他程序不能获取,VerQueryValue返回FALSE。程序如下:
function GetFileVerInfo(FileName: string; var VerInfo: TFileVerInfo): Boolean;
var
var
vsize, // version size
len: DWORD;
vbuf: PChar;
value: PChar;
begin
vsize := GetFileVersionInfoSize(PChar(FileName), len);
if vsize = 0 then Exit; vbuf := AllocMem(vsize);
if vbuf = nil then Exit;
try
if not GetFileVersionInfo(PChar(FileName), 0, vsize, vbuf) then Exit; if VerQueryValue(vbuf, PChar('StringFileInfo\080403A8\CompanyName'), Pointer(Value), Len) then // 这里返回FALSE
CompanyName:= Value;
...只能获取delphi编译出来的程序的版本信息,这是怎么回事,哪位大侠有解?
function GetFileVerInfo(FileName: string; var VerInfo: TFileVerInfo): Boolean;
var
var
vsize, // version size
len: DWORD;
vbuf: PChar;
value: PChar;
begin
vsize := GetFileVersionInfoSize(PChar(FileName), len);
if vsize = 0 then Exit; vbuf := AllocMem(vsize);
if vbuf = nil then Exit;
try
if not GetFileVersionInfo(PChar(FileName), 0, vsize, vbuf) then Exit; if VerQueryValue(vbuf, PChar('StringFileInfo\080403A8\CompanyName'), Pointer(Value), Len) then // 这里返回FALSE
CompanyName:= Value;
...只能获取delphi编译出来的程序的版本信息,这是怎么回事,哪位大侠有解?
解决方案 »
- 为何用indy 中的IdSMTP1 +IdMessage 发的邮件,在outlook 中收到的邮件是乱码!急急急!
- 做三层结构时前端传中文字时被丢掉,不知道什么原因?
- 关于数据库设计的问题???
- 头痛啊!这样的动态参数如何实现?
- ****关于ADOConnection****
- 这段sql语句怎么写?
- delphi 写服务程序 为什么连不上数据库
- 想问一个小问题,可是总解决不了。
- 200分紧急求救 webbrowser 问题!!
- delphi可以只改变Label的字体高度吗?
- [紧急求助]关于截屏时碰上截屏区域有视频,截屏内容为黑的问题,请求就
- 如何用API函数实现当串口的缓冲区有数据时触发串口读取数据及其他操作?
var
FFile: TFileName;
FInfoSize, Temp, Len: Cardinal;
InfoBuf: Pointer;
TranslationLength: Cardinal;
TranslationTable: Pointer;
LanguageID, CodePage, LookupString: String;
Value: PChar;
begin
FFile := AFileName;
if Length(FFile) = 0 then
FFile := TSystemConst.Instance.AppName; FInfoSize := GetFileVersionInfoSize(PChar(FFile), Temp);
FAvailable := FInfoSize > 0;
if FAvailable then
begin
InfoBuf := AllocMem(FInfoSize);
try // try
GetFileVersionInfo(PChar(FFile), 0, FInfoSize, InfoBuf); if VerQueryValue( InfoBuf, '\VarFileInfo\Translation', TranslationTable, TranslationLength ) then
begin
CodePage := Format( '%.4x', [ HiWord( PLongInt( TranslationTable )^ ) ] );
LanguageID := Format( '%.4x', [ LoWord( PLongInt( TranslationTable )^ ) ] );
end;
LookupString := 'StringFileInfo\' + LanguageID + CodePage + '\';
if VerQueryValue( InfoBuf, PChar( LookupString + 'CompanyName' ), Pointer( Value ), Len ) then
FCompanyName := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'FileDescription' ), Pointer( Value ), Len ) then
FFileDescription := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'FileVersion' ), Pointer( Value ), Len ) then
FFileVersion := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'InternalName' ), Pointer( Value ), Len ) then
FInternalName := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'LegalCopyright' ), Pointer( Value ), Len ) then
FLegalCopyright := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'LegalTrades' ), Pointer( Value ), Len ) then
FLegalTradeMarks := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'OriginalFilename' ), Pointer( Value ), Len ) then
FOriginalFilename := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'ProductName' ), Pointer( Value ), Len ) then
FProductName := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'ProductVersion' ), Pointer( Value ), Len ) then
FProductVersion := Value;
if VerQueryValue( InfoBuf, PChar( LookupString + 'Comments' ), Pointer( Value ), Len ) then
FComments := Value;
finally // wrap up finally
FreeMem(InfoBuf, FInfoSize);
end; // end try finally
end;
end;