获取delphi文件版本信息的疑问

zhaoxiaohao 2009-03-30 11:16:07
我想获得delphi生成的exe文件版本信息,在网上找了许多都比较雷同,和下面的楼主贴的代码差不多,
http://topic.csdn.net/u/20090220/07/5be8f3d2-16ee-4a57-b272-d811de20bcfc.html但是通过此方法看到僵哥的回帖,可能有些文件通过此固定写路径方法无法获得版本信息,照猫画虎的把僵哥的代码移植过来,发现不能编译,有两处变量声明也许不对。现向僵哥和大家请教!

我改后的代码见下:问题1、红色部分提示声明不对,应声名成什么类型?问题2、我查setstring,第一个变量是string型,如此声明(lpFileVersion^)有什么好处吗?如各位还有其他获得版本信息的方法或注意事项希望大家分享一下,谢谢!
var
VerInfo:PChar;
lpTranslat:pchar;
FileName:String;
VerInfoSize,cbTranslate:DWORD;
VerValueSize:DWORD;
Data:String;

VerFileV:PChar;
lpFileVersion:String;
begin
FileName:=Application.ExeName;
VerInfoSize:=GetFileVersionInfoSize(PChar(FileName),VerInfoSize);
if VerInfoSize>0 then
begin
VerInfo:=AllocMem(VerInfoSize);

GetFileVersionInfo(PChar(FileName),0,VerInfoSize,VerInfo);

VerQueryValue(VerInfo, PChar('\VarFileInfo\Translation'), Pointer(lpTranslate),cbTranslate);

if cbTranslate<>0 then
begin
Data := format('\StringFileInfo\%.4x%.4x\FileVersion',[lpTranslate^.wLanguage,lpTranslate^.wCodePage]);
//显示错误信息:Record,object or class type required
VerQueryValue(Buf, PAnsiChar(data),Pointer(VerFileV), VerValueSize);
//显示错误信息:Missing operator or semicolon
if VerValueSize <> 0 then
begin
SetString(lpFileVersion^,VerFileV,VerValueSize-1);
//错误显示:Pointer type required
end;
end;
FreeMem(VerInfo,VerInfoSize);
end
else begin
Application.MessageBox('获取文件版本信息错误,请重新启动。','错误',MB_OK+MB_ICONSTOP);
Application.Terminate;
end;
end;
...全文
181 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2009-03-30
  • 打赏
  • 举报
回复
function GetVersion(Filename: String;lpCompanyName: PString = Nil): string;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
lpTranslate:PLANGANDCODEPAGE;
cbTranslate: LongWord;
VerCompany: PAnsiChar;
Dummy: DWORD;

Data: String;
begin
Result := '0.0.0.0';

VerInfoSize := GetFileVersionInfoSize(PChar(Filename), Dummy);
if VerInfoSize = 0 then Exit;

GetMem(VerInfo, VerInfoSize);
try
GetFileVersionInfo(PChar(Filename), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
dwProductVersionMS := dwFileVersionMS;
dwProductVersionLS := dwFileVersionLS;
Result :=Format('%d.%d.%d.%d', [
dwProductVersionMS shr 16,
dwProductVersionMS and $FFFF,
dwProductVersionLS shr 16,
dwProductVersionLS and $FFFF
]);
end;

if lpCompanyName = Nil then Exit;
VerQueryValue(VerInfo,
'\VarFileInfo\Translation',
Pointer(lpTranslate),
cbTranslate);
if cbTranslate = 0 then Exit;
//for I := 0 to cbTranslate - 1 do begin
Data := format('\StringFileInfo\%.4x%.4x\CompanyName',[lpTranslate^.wLanguage,lpTranslate^.wCodePage]);
VerQueryValue( VerInfo
, PAnsiChar(data)
, Pointer(VerCompany)
, VerValueSize);
if VerValueSize <> 0 then begin
SetString(lpCompanyName^, VerCompany, VerValueSize-1);
end;
Inc(lpTranslate, sizeof(LANGANDCODEPAGE));
//end;

finally
FreeMem(VerInfo);
end;



end;
zhaoxiaohao 2009-03-30
  • 打赏
  • 举报
回复
我猜想lpTranslate是否是记录类型?
这样写的含义format('\StringFileInfo\%.4x%.4x\FileVersion',[lpTranslate^.wLanguage,lpTranslate^.wCodePage]);是什么呢?
zhaoxiaohao 2009-03-30
  • 打赏
  • 举报
回复
第二个错误我发现了,是我名字的问题,现希望能解决剩下的问题
VerQueryValue(Buf, PAnsiChar(data),Pointer(VerFileV), VerValueSize);
//显示错误信息:Missing operator or semicolon
zhaoxiaohao 2009-03-30
  • 打赏
  • 举报
回复
自己再补充上记录类型的声明
type
TLANGANDCODEPAGE=record
wLanguage,wCodePage:Word;
end;
PLANGANDCODEPAGE=^TLANGANDCODEPAGE;
zhaoxiaohao 2009-03-30
  • 打赏
  • 举报
回复
謝謝僵哥,問題搞定!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧