部分摘自:《Windows95API开发人指南》
1. 代码
代码段一:
void CVersionDlg::OnInspect()
{
UpdateData();
//获取编辑框的文本信息
char ebuffer[256];
GetDlgItem(IDC_EDIT1)->GetWindowText(ebuffer,256);
BYTE block[1024];
DWORD FAR* translation;
DWORD FAR* buffer;
DWORD handle;
DWORD bytes;
char name[2048];
char data[256];
//获取信息的实际长度
bytes=GetFileVersionInfoSize(ebuffer,&handle);
if(bytes)
{
//获取实际的版本信息
bytes=2048;
if(GetFileVersionInfo(ebuffer,handle,bytes,block))
{
if(VerQueryValue(block,"//VarFileInfo//Translation",
(VOID *FAR *)&translation,
(UINT FAR *)&bytes))
{
wsprintf(name,"//StringFileInfo//%04x//ProductVersion",
LOWORD(*translation),
HIWORD(*translation));
if(VerQueryValue(block,name,
(VOID FAR*FAR*)&buffer,
(UINT FAR*) &bytes))
{
lstrcpy(data,(char far*)buffer);
GetDlgItem(IDC_VER_PRODUCT_VERSION)->SetWindowText(data);
}
}
else
{
MessageBox("Unable to geet translation type ","Error",MB_OK);
}
//之后获取公司的名称
wsprintf(name,"//StringFileInfo//%04x//CompanyName",
LOWORD(*translation),
HIWORD(*translation));
if(VerQueryValue(block,name,
(VOID FAR*FAR*)&buffer,
(UINT FAR*) &bytes))
{
lstrcpy(data,(char far*)buffer);
GetDlgItem(IDC_VER_COMPANY_NAME)->SetWindowText(data);
}
//获取起始文件
wsprintf(name,"//StringFileInfo//%04x//OriginalFileName",
LOWORD(*translation),
HIWORD(*translation));
if(VerQueryValue(block,name,
(VOID FAR*FAR*)&buffer,
(UINT FAR*) &bytes))
{
lstrcpy(data,(char far*)buffer);
GetDlgItem(IDC_VER_ORIG_FILENAME)->SetWindowText(data);
}
//获取文件描述名称
wsprintf(name,"//StringFileInfo//%04x//FileDescription",
LOWORD(*translation),
HIWORD(*translation));
if(VerQueryValue(block,name,
(VOID FAR*FAR*)&buffer,
(UINT FAR*) &bytes))
{
lstrcpy(data,(char far*)buffer);
GetDlgItem(IDC_VER_FILE_DESC)->SetWindowText(data);
}
//获取文件版本
wsprintf(name,"//StringFileInfo//%04x//FileVersion",
LOWORD(*translation),
HIWORD(*translation));
if(VerQueryValue(block,name,
(VOID FAR*FAR*)&buffer,
(UINT FAR*) &bytes))
{
lstrcpy(data,(char far*)buffer);
GetDlgItem(IDC_VER_FILE_VERSION)->SetWindowText(data);
}
//获取内部文件名
wsprintf(name,"//StringFileInfo//%04x//InternalName",
LOWORD(*translation),
HIWORD(*translation));
if(VerQueryValue(block,name,
(VOID FAR*FAR*)&buffer,
(UINT FAR*) &bytes))
{
lstrcpy(data,(char far*)buffer);
GetDlgItem(IDC_VER_INTERNAL_NAME)->SetWindowText(data);
}
//获取产品名称
wsprintf(name,"//StringFileInfo//%04x//ProductName",
LOWORD(*translation),
HIWORD(*translation));
if(VerQueryValue(block,name,
(VOID FAR*FAR*)&buffer,
(UINT FAR*) &bytes))
{
lstrcpy(data,(char far*)buffer);
GetDlgItem(IDC_VER_PRODUCT_NAME)->SetWindowText(data);
}
}
}
UpdateData();
}
代码段二
void CVersionDlg::OnBrowse()
{
//打开一个文件打开对话框
Static char szFilter[]="DLL(*.dll)|*.DLL|Execuatables(*.exe)|*.exe|All Files(*.*)|*.*||";
CFileDialog dlg(TRUE,"Dll",NULL,OFN_HIDEREADONLY,szFilter,this);
if(dlg.DoModal()==IDOK)
{
GetDlgItem(IDC_EDIT1)->SetWindowText(dlg.GetPathName());
}
}
代码段三:
void CMainFrame::OnVersionInfo()
{
CVersionDlg dlg;
dlg.DoModal ();
}
3. 为对话框创建新类CVersionDlg
4. 为按钮Inspect创建BN_CLICKED消息函数OnInspect()
在函数中添加代码一
//代码一得思路:
(1) 从编辑框中取出文本信息(要查询版本信息的程序名或DLL文件名路径)
GetDlgItem(IDC_EDIT1)->GetWindowText(ebuffer,256);
(2) 利用GetFileVersionInfoSize()获取版本信息的长度赋给bytes;
(3) 利用GetFileVersionInfo()获取版本信息赋给block;
(4) if(VerQueryValue(block,"//VarFileInfo//Translation",
(VOID *FAR *)&translation,
(UINT FAR *)&bytes))
获取版本信息文件的翻译表,赋给translation
(5) 整合关键字(要获取的信息的路径)再次调用VerQueryValue()获取关键字所要求的信息,赋给buffer,然后用 lstrcpy(data,(char far*)buffer); 转换buffer的格式同时赋给data,之后用 GetDlgItem(IDC_VER_PRODUCT_VERSION)->SetWindowText(data);显示在对话框中的(IDC_VER_PRODUCT_VERSION)的静态文本中。
以后的显示获取公司的名称、获取产品名称、获取内部文件名、获取文件版本、获取文件描述名称、获取起始文件…都用上面的思路
5. 利用UpdateData()更新数据。
6. 为按钮Browse创建BN_CLICKED消息函数OnBrowse()并在其中添加以下代码段二,用于打开一个文件。
7. 子菜单“版本信息”(IDM_VER_INFO)添加COMMAND消息函数OnVersionInfo()
并田间代码段三。
在CMainFrm.cpp的头部添加:#include"VersionDlg.h"
8. 编译运行即可。
注释:
出现
Deleting intermediate files and output files for project 'CH111 - Win32 Debug'.
--------------------Configuration: CH111 - Win32 Debug--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
CH111.cpp
CH111Doc.cpp
CH111View.cpp
MainFrm.cpp
VersionDlg.cpp
Generating Code...
Linking...
LINK : fatal error LNK1181: cannot open input file "version.dll"
执行 link.exe 时出错.
CH111.exe - 1 error(s), 0 warning(s)
if(VerQueryValue(block,"//VarFileInfo//Translation",
(VOID *FAR *)&translation,
(UINT FAR *)&bytes))
算法:
1. 在菜单中添加“系统信息”,其子菜单“版本信息”(IDM_VER_INFO)
文本域。标题分别为:Company Name:,File Description:, File Version:,Internal Name:,Originnal File Name:,Product Name:,Product Version:,File Name to Inspect:.
空白标题文本域。标示符分别为:IDC_VER_COMPANY_NAME,IDC_VER_FILE_DESC,IDC_VER_FILE_VERSION, IDC_VER_INTERNAL_NAME,IDC_VER_ORIG_FILENAME,IDC_VER_PRODUCT_NAME,IDC_VER_PRODUCT_VERSION
注释:按钮Inspect(IDB_INSPECT);按钮(&Browse)(IDB_BROWSE).
对话框(IDD_FILE_VERSIO_INFO)