找出程序或DLL得版本信息

部分摘自:《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

2.       新建一个对话框

      文本域。标题分别为:Company Name:,File Description:, File     Version:,Internal  Name:,Originnal File Name:,Product Name:,Product Version:,File Name to Inspect:.

       空白标题文本域。标示符分别为:IDC_VER_COMPANY_NAMEIDC_VER_FILE_DESCIDC_VER_FILE_VERSION        IDC_VER_INTERNAL_NAMEIDC_VER_ORIG_FILENAMEIDC_VER_PRODUCT_NAMEIDC_VER_PRODUCT_VERSION

 

   

注释:按钮Inspect(IDB_INSPECT);按钮(&Browse(IDB_BROWSE).

      对话框(IDD_FILE_VERSIO_INFO

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值