这个是我的源程序,但是结果是错误的,label.caption的值是奇怪的结果。你能帮我看看是哪儿出错了吗?还有VersionInfo这个pointer我可以用什么方法显示它指向地址的内容吗?谢谢!
var
ver:variant;
VerInfoSize: DWORD;
GetInfoSizeJunk: DWORD;
VersionInfo: Pointer;
Translation: Pointer;
InfoPointer: Pointer;
VersionInfoSize: UINT;
VersionValue: string;
begin
VerInfoSize := 0;
if OpenDialog1.Execute then
VerInfoSize := GetFileVersionInfoSize(PChar(OpenDialog1.FileName),
GetInfoSizeJunk);
GetMem(VersionInfo, VerInfoSize);
GetFileVersionInfo(PChar(OpenDialog1.FileName),
0,VerInfoSize, VersionInfo);
VerQueryValue(VersionInfo, '\VarFileInfo\Translation',
Translation, VersionInfoSize);
VersionValue :='\StringFileInfo\'+
IntToHex(LoWord(LongInt(Translation^)),4)+
IntToHex(HiWordLongIntTranslation^)),4+'\';
VerQueryValue(VersionInfo, PChar(VersionValue+'ProductVersion'), InfoPointer,VersionInfoSize);
Label1.Caption := string(PChar(VersionInfo));
FreeMem(VersionInfo, VerInfoSize);
end;
end.
var
ver:variant;
VerInfoSize: DWORD;
GetInfoSizeJunk: DWORD;
VersionInfo: Pointer;
Translation: Pointer;
InfoPointer: Pointer;
VersionInfoSize: UINT;
VersionValue: string;
begin
VerInfoSize := 0;
if OpenDialog1.Execute then
VerInfoSize := GetFileVersionInfoSize(PChar(OpenDialog1.FileName),
GetInfoSizeJunk);
GetMem(VersionInfo, VerInfoSize);
GetFileVersionInfo(PChar(OpenDialog1.FileName),
0,VerInfoSize, VersionInfo);
VerQueryValue(VersionInfo, '\VarFileInfo\Translation',
Translation, VersionInfoSize);
VersionValue :='\StringFileInfo\'+
IntToHex(LoWord(LongInt(Translation^)),4)+
IntToHex(HiWordLongIntTranslation^)),4+'\';
VerQueryValue(VersionInfo, PChar(VersionValue+'ProductVersion'), InfoPointer,VersionInfoSize);
Label1.Caption := string(PChar(VersionInfo));
FreeMem(VersionInfo, VerInfoSize);
end;
end.
TLANGANDCODEPAGE = record
wLanguage,
wCodePage: Word;
end;
PLANGANDCODEPAGE = ^TLANGANDCODEPAGE;var
InfoSize , Zero : DWORD;
VersionInfo ,Info : Pointer;
Translation: PLANGANDCODEPAGE;
InfoPath : String;
begin
后面的就用我上次贴的吧。另外你说的 显示它指向地址的内容 是不是这样?format('%.8x',[...]);
FixedInfo:TVSFixedFileInfo; {版本信息}
CompanyName:String; {公司名称}
FileDescription:String; {说明}
FileVersion:String; {文件版本}
InternalName:String; {内部名称}
LegalCopyright:String; {版权}
LegalTrades:String; {合法商标}
OriginalFilename:String; {源文件名}
ProductName:String; {产品名称}
ProductVersion:String; {产品版本}
Comments:String; {备注}
end;
Function GetFileVerInfo(ExeFileName :Pchar;var VerSionInfo:TFileVersionInfo):Boolean;
var
dwHandle, dwVersionSize : DWORD;
Find : String;
pcBuffer : PChar;
pTemp : Pointer;
FileVersionInfo : TVSFixedFileInfo;
begin
Find := '\';
dwVersionSize := GetFileVersionInfoSize( PChar(ExeFilename),dwHandle );
if dwVersionSize = 0 then begin
Result:=False;
Exit;
end;
GetMem( pcBuffer, dwVersionSize );
if not GetFileVersionInfo( PChar(ExeFilename),dwHandle,dwVersionSize,pcBuffer ) then begin
FreeMem(pcBuffer);
Result:=False;
Exit;
end;
if not VerQueryValue( pcBuffer,PChar(Find),pTemp,dwVersionSize ) then begin
FreeMem(pcBuffer);
Result:=False;
Exit;
end;
FileVersionInfo:=PVSFixedFileInfo(pTemp)^;
With FileVersionInfo do begin
VersionInfo.FixedInfo.dwSignature:=dwSignature;
VersionInfo.FixedInfo.dwStrucVersion:=dwStrucVersion;
VersionInfo.FixedInfo.dwFileVersionMS:=dwFileVersionMS;
VersionInfo.FixedInfo.dwFileVersionLS:=dwFileVersionLS;
VersionInfo.FixedInfo.dwProductVersionMS:=dwProductVersionMS;
VersionInfo.FixedInfo.dwProductVersionLS:=dwProductVersionLS;
VersionInfo.FixedInfo.dwFileFlagsMask:=FileVersionInfo.dwFileFlagsMask;
VersionInfo.FixedInfo.dwFileFlags:=fileVersionInfo.dwFileFlags;
VersionInfo.FixedInfo.dwFileOS:=FileVersionInfo.dwFileOS;
VersionInfo.FixedInfo.dwFileType:=FileVersionInfo.dwFileType;
VersionInfo.FixedInfo.dwFileSubtype:=FileVersionInfo.dwFileSubtype;
VersionInfo.FixedInfo.dwFileDateMS:=FileVersionInfo.dwFileDateMS;
VersionInfo.FixedInfo.dwFileDateLS:=FileVersionInfo.dwFileDateLS;
end;
Find := '\StringFileInfo\080403A8\';
if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then
VersionInfo.CompanyName:=PChar(pTemp)
else begin
Find := '\StringFileInfo\040904E4\';
if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then
VersionInfo.CompanyName:=PChar(pTemp)
else begin
Result:=False;
Exit;
end;
end;
if VerQueryValue( pcBuffer,PChar(Find+'FileDescription'),pTemp,dwVersionSize ) then
VersionInfo.FileDescription:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'FileVersion'),pTemp,dwVersionSize ) then
VersionInfo.FileVersion:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'InternalName'),pTemp,dwVersionSize ) then
VersionInfo.InternalName:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'LegalCopyright'),pTemp,dwVersionSize ) then
VersionInfo.LegalCopyright:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'LegalTrades'),pTemp,dwVersionSize ) then
VersionInfo.LegalTrades:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'OriginalFilename'),pTemp,dwVersionSize ) then
VersionInfo.OriginalFilename:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'ProductName'),pTemp,dwVersionSize ) then
VersionInfo.ProductName:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'ProductVersion'),pTemp,dwVersionSize ) then
VersionInfo.ProductVersion:=PChar(pTemp); if VerQueryValue( pcBuffer,PChar(Find+'Comments'),pTemp,dwVersionSize ) then
VersionInfo.Comments:=PChar(pTemp);
FreeMem(pcBuffer );
Result:=True;
end;