在delphi中有一个选项(include version information in project),可以自动产生编译程序的版本号,那位大侠知道如何读取该版本号,最好能提供一些源代码?
解决方案 »
- 求一款功能比较全的有源代码的企业管理系统
- 独家:Delphi 2010初体验,是时候抛弃Delphi 7了
- 多线程
- 急:delphi中如何把真彩色的tiff文件转变成非彩色的tiff文件??
- 请教:popupmenu 菜单中的 '_' 要设置哪个属性才有的啊,谢谢!
- 我为什么在Windows单元中找不到ImmIsIME函数,我要用它判断输入法,在哪儿能找到他?
- 存储过程有什么错?
- 怎么使变量可以在整个project中引用 啊?急~~谢谢
- 在delphi 中 paradox表结构如何确定字段的小数位
- 求救!!!请问各位大虾哪里有通用的打印模块下载?
- 现在找工?!大家谈谈自己的找工经验?! 另:广州那边的工作好找么?!
- DELPHI初学者的简单问题!
VersionInfoList:TStringList);
var
Fn,TransLationStr,VersionKeyName :String;
AllVersionInfoSize,lpdwHandle,VersionInfoSize :Cardinal;
PAllVersionInfo,PVersionInfo :Pointer;
VersionKeyNameList :TStringList;
InfoKeyIndex :Integer;
begin
{-----------------------------------------------------------------------------
过 程: GetSoftVersionInfo
作 者: 蔡建荣
日 期: 2002年11月21日 星期四
参 数:
入口参数:
------------------------
SoftFileName为所要获取版本信息的文件,为空则默认为当前程序。
KeyInfoList 为所要获取指定何种信息,各类型以';'隔开,不包括引号。
出口参数:
------------------------
VersionInfoList 为所获取的版本信息。
返回值: 文件版本信息
备 注: --------------------------
使用到的API如下: *获取文件版本信息的大小;
function GetFileVersionInfoSize(lptstrFilename:PChar;
var lpdwHandle:Cardinal):Cardinal;
**lptstrFilename所要获取版本信息的文件名;
lpdwHandle 则为函数需要赋值0的变量;
函数返回值: 当函数执行成功时,函数返回的为文件版本信息的大小,
当函数执行失败,返回0; *获取文件版本信息;
function GetFileVersionInfo(lptstrFilename:PChar;dwHandle:Cardinal;
dwLen:Cardinal;lpData:Pointer):Boolean
lptstrFilename同上
dwHandle 该变量可忽略
dwLen 指定接收版本信息的缓存的大小
lpData 指向版本信息的指针 *从文件版本信息中取对应的值
function VerQueryValue(pBlock:Pointer;lpSubBlock:PChar;
var lplpBuffer:Pointer;var puLen :Cardinal):Boolean;
**pBlock 即由GetFileVersionInfo函数中取得的lpData
lpSubBlock 指定要取得的版本信息的哪种信息
可取如下三种形式的值
'\','\VarFileInfo\Translation',
'\StringFileInfo\lang-charset\string-name'
版本信息一般有如下几种
CompanyName FileDescription FileVersion InternalName LegalCopyright
OriginalFilename ProductName ProductVersion lplpBuffer 指定用于接收取得的版本信息的缓冲
puLen 指定用于接收取得的版本信息的缓冲的大小
-------------------------------------------------------------------------------------------------------}
{ 初始化所要获取的文件路径 }
if SoftFileName='' then Fn :=Application.ExeName
else Fn :=SoftFileName; { 初始化所要获取的版本信息的类型 }
VersionKeyNameList :=TStringList.Create();
VersionKeyNameList.Text :=StringReplace(InfoKeyList,';',#13#10,[rfReplaceAll]); AllVersionInfoSize :=GetFileVersionInfoSize(PChar(Fn),lpdwHandle);
if AllVersionInfoSize>0 then
{ 若执行成功,则开始取版本信息 }
begin
GetMem(PAllVersionInfo,AllVersionInfoSize);
if GetFileVersionInfo(PChar(Fn),lpdwHandle,AllVersionInfoSize,
PAllVersionInfo) then
{ 若取版本信息成功,则开始分离版本信息 }
begin
{ 指针赋值之前,需事先分配内存,若不知大小可指向空指针 }
PVersionInfo :=nil;
{ 取文件版本信息的所在 }
VerQueryValue(PAllVersionInfo,'\VarFileInfo\Translation',PVersionInfo,
VersionInfoSize);
if PVersionInfo <> nil then
begin
TransLationStr :=IntToHex(MakeLong(HiWord(Longint(PVersionInfo^)),
LoWord(Longint(PVersionInfo^))), 8);
end; { 取文件版本信息中的指定信息 }
for InfoKeyIndex :=0 to VersionKeyNameList.Count-1 do
begin
VersionKeyName :=VersionKeyNameList[InfoKeyIndex];
{
CompanyName FileDescription FileVersion InternalName LegalCopyright
OriginalFilename ProductName ProductVersion
}
if VersionKeyName <>'' then
begin
if VerQueryValue(PAllVersionInfo,PChar('\StringFileInfo\'+
TransLationStr+'\'+VersionKeyName),PVersionInfo,VersionInfoSize)
then
begin
VersionInfoList.Add(String(PChar(PVersionInfo)));
end
else
begin
VersionInfoList.Add('');
end;
end;
end;
end;
FreeMem(PAllVersionInfo);
end;
VersionKeyNameList.Free();
end;
可这样子调用
var
VersionInfoList :TStringList;
begin
VersionInfoList :=TStringList.Create();
GetSoftVersionInfo('','FileVersion',VersionInfoList);
EDMsg.Text :='本程序文件当前版本:'+VersionInfoList[0];
VersionInfoList.Free();
end;
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;
lDummy : DWORD;
value:pchar;begin
S:=Application.ExeName;
n:=GetFileVersionInfoSize(PChar(s),lDummy);
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;
我自己写了一个函数,总是报错?大家看一下那的原因啊!我可是个新手啊,大家多多帮助!
function VerQueryValue(pBlock:Pointer;lpSubBlock:PChar;
var lplpBuffer:Pointer;var puLen :Cardinal):Boolean;
知不知道是哪错啦?第二条、040904E4这一串应该以
{ 取文件版本信息的所在 }
VerQueryValue(PAllVersionInfo,'\VarFileInfo\Translation',PVersionInfo,
VersionInfoSize);
if PVersionInfo <> nil then
begin
TransLationStr :=IntToHex(MakeLong(HiWord(Longint(PVersionInfo^)),
LoWord(Longint(PVersionInfo^))), 8);
end;
方式得到最后改了一下你的代码
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,TranslationStr:string;
n,len,i:integer;
lDummy : DWORD;
buf,value:PChar;
begin
S:=Application.ExeName;
n:=GetFileVersionInfoSize(PChar(s),lDummy);
if n>0 then
begin
buf:=AllocMem(n);
Memo1.Lines.Add('FileVersionInfoSize='+IntToStr(n));
GetFileVersionInfo(Pchar(s),lDummy,n,Buf); value :=nil;
{ 取文件版本信息的所在 }
VerQueryValue(Pointer(buf),'\VarFileInfo\Translation',Pointer(value),Cardinal(len));
if value <> nil then
begin
TransLationStr :=IntToHex(MakeLong(HiWord(Longint(Pointer(value)^)),
LoWord(Longint(Pointer(value)^))), 8);
end;
//showmessage(TransLationStr); for i:=1 to infoNum do
begin
if VerQueryValue(Pointer(Buf),Pchar('StringFileInfo\'+TransLationStr+'\'+InfoStr[i]),Pointer(value),Cardinal(len)) then
Memo1.Lines.Add(InfoStr[i]+'='+String(Value));
end;
FreeMem(Buf,n);
end
else
memo1.Lines.Add('No FileVersionInfo found');end;