社区
Windows SDK/API
帖子详情
问:该调用什么API获取可执行文件(.Exe,.Dll等)的版本,公司名称,程序名称等信息呢?
wangchinaking
2003-06-18 10:02:05
please,很急啊:(
...全文
134
4
打赏
收藏
问:该调用什么API获取可执行文件(.Exe,.Dll等)的版本,公司名称,程序名称等信息呢?
please,很急啊:(
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tw_cshn
2003-06-18
打赏
举报
回复
GOOD
wangchinaking
2003-06-18
打赏
举报
回复
什么长啊?!
最重要的是想问, 我如何对执行文件的上述版本信息进行修改呢?有没有API可以做到,我查询了MSDN,好像没有发现这样的函数啊!
hammer_shi
2003-06-18
打赏
举报
回复
ListBox1.Items.Add('FileVersion:' + info.FileVersion);
ListBox1.Items.Add('InternalName:' + info.InternalName);
ListBox1.Items.Add('LegalCopyright:' + info.LegalCopyright);
ListBox1.Items.Add('LegalTrademarks:' + info.LegalTrademarks);
ListBox1.Items.Add('OriginalFileName:' + info.OriginalFileName);
ListBox1.Items.Add('ProductName:' + info.ProductName);
ListBox1.Items.Add('ProductVersion:' + info.ProductVersion);
ListBox1.Items.Add('UserDefineValue:' + info.UserDefineValue);
if boolean(info.VsFixedFileInfo.dwFileFlags and vs_FF_Debug) then
listbox1.Items.Add('Debug:True')
else
ListBox1.Items.Add('Debug:False');
ListBox1.Items.Add('');
end;
end;
end;
*******************
GoodHope:
下面是我抽空写的一个读取全部版本信息的函数,由于工作紧张,没有写释放部分。
这个函数假定版本信息已经存到一个文件中,其实直接用GetFileVersionInfo取得的内容初始化TMemoryStream也是完全可以的。
type
TFileInfo = packed record
CommpanyName: string;
FileDescription: string;
FileVersion: string;
InternalName: string;
LegalCopyright: string;
LegalTrademarks: string;
OriginalFileName: string;
ProductName: string;
ProductVersion: string;
Comments: string;
VsFixedFileInfo:VS_FIXEDFILEINFO;
UserDefineValue:string;
end;
PAString = ^TAString;
TAString = packed record
wLength: WORD;
wValueLength: WORD;
wType: WORD;
szKey: PWCHAR;
Padding: PWCHAR;
Value: PWCHAR;
end;
PStringTable = ^TStringTable;
TStringTable = packed record
wLength: WORD;
wValueLength: WORD;
wType: WORD;
szKey: PWCHAR;
Padding: PWCHAR;
Children: array of PAString;
end;
PStringFileInfo = ^TStringFileInfo;
TStringFileInfo = packed record
wLength: WORD;
wValueLength: WORD;
wType: WORD;
szKey: PWCHAR;
Padding: PWCHAR;
Children: array of PStringTable;
end;
PAVar = ^TAVar;
TAVar = packed record
wLength: WORD;
wValueLength: WORD;
wType: WORD;
szKey: PWCHAR;
Padding: PWCHAR;
Value: PWCHAR;
end;
PVarFileInfo = ^TVarFileInfo;
TVarFileInfo = packed record
wLength: WORD;
wValueLength: WORD;
wType: WORD;
szKey: PWCHAR;
Padding: PWCHAR;
Children: array of PAVar;
end;
PVSVersionInfo = ^TVSVersionInfo;
TVSVersionInfo = packed record
wLength: WORD;
wValueLength: WORD;
wType: WORD;
szKey: PWCHAR;
Padding1: PWCHAR;
Value: TVSFixedFileInfo;
Padding2: PWCHAR;
StringFileInfo: PStringFileInfo;
VarFileInfo: PVarFileInfo;
end;
function LoadVersionInfo(const FileName: string): PVSVersionInfo;
var
Stream: TMemoryStream;
function ReadWideString: PWideChar;
var
iCount, iSize: Integer;
Buffer: PWideChar;
wcTerminal: WideChar;
begin
Result := nil;
Buffer := Pointer(Integer(Stream.Memory) + Stream.Position);
wcTerminal := #0;
for iCount := 0 to ((Stream.Size - Stream.Position) div 2) - 1 do
if Buffer[iCount] = wcTerminal then begin
iSize := Succ(iCount) * SizeOf(WideChar);
Result := AllocMem(iSize);
Stream.Read(Result^, iSize);
Exit;
end;
end;
function AlignToDWord: PWideChar;
var
iCount: Integer;
begin
iCount := Stream.Position mod 4;
if iCount = 0 then
Result := nil
else begin
Result := AllocMem(((iCount + 1) div 2) * SizeOf(WideChar));
Stream.Read(Result^, iCount);
end;
end;
function ReadString: PAString;
begin
New(Result);
Stream.Read(Result.wLength, SizeOf(WORD));
Stream.Read(Result.wValueLength, SizeOf(WORD));
Stream.Read(Result.wType, SizeOf(WORD));
Result.szKey := ReadWideString;
ResultPadding := AlignToDWord;
Result.Value := ReadWideString;
AlignToDWord;
end;
function ReadStringTable:PStringTable;
var
TerminalPos: Integer;
begin
TerminalPos := Stream.Position;
New(Result);
Stream.Read(Result.wLength, SizeOf(WORD));
Stream.Read(Result.wValueLength, SizeOf(WORD));
Stream.Read(Result.wType, SizeOf(WORD));
Result.szKey := ReadWideString;
ResultPadding := AlignToDWord;
Inc(TerminalPos, Result.wLength);
while Stream.Position < TerminalPos - 1 do begin
SetLength(Result.Children, Length(Result.Children) + 1);
Result.Children[High(Result.Children)] := ReadString;
end;
end;
function ReadStringFileInfo: PStringFileInfo;
var
TerminalPos: Integer;
begin
TerminalPos := Stream.Position;
New(Result);
Stream.Read(Result.wLength, SizeOf(WORD));
Stream.Read(Result.wValueLength, SizeOf(WORD));
Stream.Read(Result.wType, SizeOf(WORD));
Result.szKey := ReadWideString;
ResultPadding := AlignToDWord;
Inc(TerminalPos, Result.wLength);
while Stream.Position < TerminalPos - 1 do begin
SetLength(Result.Children, Length(Result.Children) + 1);
Result.Children[High(Result.Children)] := ReadStringTable;
end;
end;
function ReadAVar: PAVar;
begin
New(Result);
Stream.Read(Result.wLength, SizeOf(WORD));
Stream.Read(Result.wValueLength, SizeOf(WORD));
Stream.Read(Result.wType, SizeOf(WORD));
Result.szKey := ReadWideString;
ResultPadding := AlignToDWord;
Result.Value := ReadWideString;
AlignToDWord;
end;
function ReadVarFileInfo: PVarFileInfo;
var
TerminalPos: Integer;
begin
TerminalPos := Stream.Position;
New(Result);
Stream.Read(Result.wLength, SizeOf(WORD));
Stream.Read(Result.wValueLength, SizeOf(WORD));
Stream.Read(Result.wType, SizeOf(WORD));
Result.szKey := ReadWideString;
ResultPadding := AlignToDWord;
Inc(TerminalPos, Result.wLength);
while Stream.Position < TerminalPos - 1 do begin
SetLength(Result.Children, Length(Result.Children) + 1);
Result.Children[High(Result.Children)] := ReadAVar;
end;
end;
begin
New(Result);
Stream := TMemoryStream.Create;
Stream.LoadFromFile(FileName);
Stream.Read(Result.wLength, SizeOf(ResultwLength));
Stream.Read(Result.wValueLength, SizeOf(Result.wValueLength));
Stream.Read(Result.wType, SizeOf(Result.wType));
Result.szKey := ReadWideString;
Result.Padding1 := AlignToDWord;
Stream.Read(Result.Value, SizeOf(Result.Value));
Result.StringFileInfo := ReadStringFileInfo;
Result.VarFileInfo := ReadVarFileInfo;
Stream.Free;
end;
hammer_shi
2003-06-18
打赏
举报
回复
定一个版本信息结构:
type
PFixedFileInfo = ^TFixedFileInfo;
TFixedFileInfo = record
dwSignature : DWORD;
dwStrucVersion : DWORD;
wFileVersionMS : WORD; // 次版本号
wFileVersionLS : WORD; // 主版本号
wProductVersionMS : WORD; // 建立次数(build)
wProductVersionLS : WORD; // 发行次数(release)
dwFileFlagsMask : DWORD;
dwFileFlags : DWORD;
dwFileOS : DWORD;
dwFileType : DWORD;
dwFileSubtype : DWORD;
dwFileDateMS : DWORD;
dwFileDateLS : DWORD;
end; // TFixedFileInfo
下面是取版本信息函数
function FileInfo( const FileName :String ) : TFixedFileInfo;
var
dwHandle, dwVersionSize : DWORD;
strSubBlock : String;
pTemp : Pointer;
pData : Pointer;
begin
strSubBlock := ';
// 取得文件版本信息的大小
dwVersionSize := GetFileVersionInfoSize( PChar( FileName ), dwHandle );
if dwVersionSize <> 0 then
begin
GetMem( pTemp, dwVersionSize );
try
//取文件版本信息
if GetFileVersionInfo( PChar( FileName ),dwHandle,
dwVersionSize,pTemp ) then
//查询文件版本信息
if VerQueryValue( pTemp,PChar( strSubBlock ),
pData,dwVersionSize ) then
Result := PFixedFileInfo( pData )^;
finally
FreeMem( pTemp );
end; // try
end; // if dwVersionSize
end;
调用例子:
var
f1:string;
x :TFixedFileInfo;
begin
f1 := Application.ExeName;
x := FileInfo( f1 );
ShowMessage( f1 +
#13#10'Version: ' + IntToStr( x.wFileVersionLS ) + '.' +
IntToStr( x.wFileVersionMS ) +
#13#10'Release: ' + IntToStr( x.wProductVersionLS) +
#13#10'Build: ' + IntToStr( x.wProductVersionMS ) );
end;
**********************************
获取文件版本信息
type
TFileInfo = packed record
CommpanyName: string;
FileDescription: string;
FileVersion: string;
InternalName: string;
LegalCopyright: string;
LegalTrademarks: string;
OriginalFileName: string;
ProductName: string;
ProductVersion: string;
Comments: string;
VsFixedFileInfo:VS_FIXEDFILEINFO;
UserDefineValue:string;
end;
function GetFileVersionInfomation(const FileName: string; var info: TFileInfo;UserDefine:string=''):
boolean;
const
SFInfo= ';
var
VersionInfo: Pointer;
InfoSize: DWORD;
InfoPointer: Pointer;
Translation: Pointer;
VersionValue: string;
unused: DWORD;
begin
unused := 0;
Result := False;
InfoSize := GetFileVersionInfoSize(pchar(FileName), unused);
if InfoSize > 0 then
begin
GetMem(VersionInfo, InfoSize);
Result := GetFileVersionInfo(pchar(FileName), 0, InfoSize, VersionInfo);
if Result then
begin
VerQueryValue(VersionInfo, '', Translation, InfoSize);
VersionValue := SFInfo + IntToHex(LoWord(Longint(Translation^)), 4) +
IntToHex(HiWord(Longint(Translation^)), 4) + ';
VerQueryValue(VersionInfo, pchar(VersionValue + 'CompanyName'), InfoPointer, InfoSize);
info.CommpanyName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'FileDescription'), InfoPointer, InfoSize);
info.FileDescription := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'FileVersion'), InfoPointer, InfoSize);
info.FileVersion := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'InternalName'), InfoPointer, InfoSize);
info.InternalName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'LegalCopyright'), InfoPointer, InfoSize);
info.LegalCopyright := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'LegalTrademarks'), InfoPointer, InfoSize);
info.LegalTrademarks := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'OriginalFileName'), InfoPointer, InfoSize);
info.OriginalFileName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'ProductName'), InfoPointer, InfoSize);
info.ProductName := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'ProductVersion'), InfoPointer, InfoSize);
info.ProductVersion := string(pchar(InfoPointer));
VerQueryValue(VersionInfo, pchar(VersionValue + 'Comments'), InfoPointer, InfoSize);
info.Comments := string(pchar(InfoPointer));
if VerQueryValue(VersionInfo, ', InfoPointer, InfoSize) then
info.VsFixedFileInfo := TVSFixedFileInfo(InfoPointer^);
if UserDefine<>'' then
begin
if VerQueryValue(VersionInfo,pchar(VersionValue+UserDefine),InfoPointer,InfoSize) then
info.UserDefineValue:=string(pchar(InfoPointer));
end;
end;
FreeMem(VersionInfo);
end;
end;
调用演示:
procedure TForm1.Button1Click(Sender: TObject);
var
info: TFileInfo;
begin
if OpenDialog1.Execute then
begin
if GetFileVersionInfomation(opendialog1.FileName, info,'WOW Version') then
begin
Listbox1.Items.Add(OpenDialog1.FileName);
ListBox1.Items.Add('Comments:' + info.Comments);
ListBox1.Items.Add('CommpanyName:' + info.CommpanyName);
ListBox1.Items.Add('FileDescription:' + info.FileDescription);
VS2013编写一个
DLL
,并创建
EXE
对
DLL
进行
调用
本文介绍了如何在VS2013中创建一个
DLL
项目,并生成一个
EXE
程序
来
调用
该
DLL
。首先,通过新建Win32控制台
程序
并选择
DLL
模板创建
DLL
。然后,创建一个
EXE
项目,并将
DLL
头文件和库文件引入,设置附加包含目录和库目录。最后,将
DLL
拷贝到
EXE
的Debug目录下,并在
EXE
源代码中
调用
DLL
中的函数。
VS2017利用dumpbin工具查看
exe
和
dll
的依赖项或提供的
API
本文介绍了在VS2017中使用dumpbin工具的方法。通过打开VS2017提供的命令提示,可查看
DLL
提供的
API
接口,以及
EXE
依赖的
DLL
。还详细介绍了dumpbin的各种选项,如/ALL、/EXPORTS等,可用于不同场景的
信息
查看。
获取
EXE
或者
DLL
的
版本
信息
本文介绍了一个成熟的类库,用于从
EXE
或
DLL
文件中读取
版本
信息
,包括文件描述、
公司
名称
、
版本
号等,并提供了详细的类定义及其实现代码。
vs2010生成和使用.
dll
,.lib和.
exe
文件
本文详细介绍了如何在VS2010中创建动态库.
dll
、静态库.lib和
可执行文件
.
exe
。通过实例演示了生成过程,包括设置项目类型、添加源代码、导出符号等,并讲解了隐式和显示
调用
.
dll
库的方法。此外,还涵盖了生成静态库和使用静态库的步骤。
为
EXE
/
DLL
添加
版本
信息
,奋战至深夜 收藏 作者:liigo
本文介绍如何为
EXE
或
DLL
文件添加
版本
信息
,包括必须存在的'文件
版本
'字段、正确设置语言
信息
、处理字节对齐
问
题以及VS_FIXEDFILEINFO结构中的未详细说明成员。
Windows SDK/API
1,184
社区成员
22,326
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章