如何得到一个程序的版本号!

moleboy 2003-11-02 10:47:22
如何得到一个程序的版本号!
...全文
112 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyi3000 2003-11-03
  • 打赏
  • 举报
回复
study
  • 打赏
  • 举报
回复
学习
fulongbiao 2003-11-03
  • 打赏
  • 举报
回复
用GetFileVersionInfo api函数
楼上的厉害,我就不巾贴实例了
flxa 2003-11-03
  • 打赏
  • 举报
回复
GetFileVersionInfo
suntt 2003-11-03
  • 打赏
  • 举报
回复
接上面


'**** 获取文件所适应的操作系统 ****
Select Case udtVerBuffer.dwFileOS
Case VOS_WINDOWS32
FileOS = "Win32位操作系统"
Case VOS_WINDOWS16
FileOS = "Win16位操作系统"
Case VOS_DOS
FileOS = "DOS操作系统"
Case VOS_DOS_WINDOWS16
FileOS = "DOS-Win16操作系统"
Case VOS_DOS_WINDOWS32
FileOS = "DOS-Win32操作系统"
Case VOS_OS216_PM16
FileOS = "OS/2-16 PM-16操作系统"
Case VOS_OS232_PM32
FileOS = "OS/2-16 PM-32操作系统"
Case VOS_NT_WINDOWS32
FileOS = "NT-Win32操作系统"
Case Else
FileOS = "未知操作系统"
End Select
Select Case udtVerBuffer.dwFileType
Case VFT_APP
FileType = "应用程序"
Case VFT_DLL
FileType = "动态连接库"
Case VFT_DRV
FileType = "驱动程序"
Select Case udtVerBuffer.dwFileSubtype
Case VFT2_DRV_PRINTER
FileSubType = "打印驱动程序"
Case VFT2_DRV_KEYBOARD
FileSubType = "键盘驱动程序"
Case VFT2_DRV_LANGUAGE
FileSubType = "语言模块"
Case VFT2_DRV_DISPLAY
FileSubType = "显示驱动程序"
Case VFT2_DRV_MOUSE
FileSubType = "鼠标驱动程序"
Case VFT2_DRV_NETWORK
FileSubType = "网络驱动程序"
Case VFT2_DRV_SYSTEM
FileSubType = "系统驱动程序"
Case VFT2_DRV_INSTALLABLE
FileSubType = "Installable"
Case VFT2_DRV_SOUND
FileSubType = "声音驱动程序"
Case VFT2_DRV_COMM
FileSubType = "串行驱动程序"
Case VFT2_UNKNOWN
FileSubType = "未知驱动程序"
End Select
Case VFT_FONT
FileType = "字体"
Select Case udtVerBuffer.dwFileSubtype
Case VFT_FONT_RASTER
FileSubType = "光栅字体"
Case VFT_FONT_VECTOR
FileSubType = "矢量字体"
Case VFT_FONT_TRUETYPE
FileSubType = "TrueType字体"
End Select
Case VFT_VXD
FileType = "VxD"
Case VFT_STATIC_LIB
FileType = "Lib"
Case Else
FileType = "未知"
End Select
Form1.CurrentX = 4
Form1.CurrentY = 4
Form1.Print "文件全路径:"
Form1.CurrentX = 4
Form1.Print "文件版本:"
Form1.CurrentX = 4
Form1.Print "产品版本:"
Form1.CurrentX = 4
Form1.Print "文件标志:"
Form1.CurrentX = 4
Form1.Print "操作系统:"
Form1.CurrentX = 4
Form1.Print "文件类型:"
Form1.CurrentX = 4
Form1.Print "文件子类型:"
Form1.CurrentX = 60
Form1.CurrentY = 4
Form1.Print FullFileName
Form1.CurrentX = 60
Form1.Print FileVer
Form1.CurrentX = 60
Form1.Print ProdVer
Form1.CurrentX = 60
Form1.Print FileFlags
Form1.CurrentX = 60
Form1.Print FileOS
Form1.CurrentX = 60
Form1.Print FileType
Form1.CurrentX = 60
Form1.Print FileSubType
'清除上一次保存的信息
FullFileName = ""
FileVer = ""
ProdVer = ""
FileFlags = ""
FileOS = ""
FileType = ""
FileSubType = ""


ReDim aBuffer(lBufferLen)
Dim ab As VS_NEWINFO

lVerPointer = 0
rc = GetFileVersionInfo(FullFileName, 0&, lBufferLen, sBuffer(0))
rc = VerQueryValue(sBuffer(0), "\VarFileInfo\Translation", lVerPointer, lVerbufferLen)
MoveMemory lTran, lVerPointer, 4&
astr = "0" + Hex$(lTran)
astr = Right$(astr, 4) + Left$(astr, 4)
rc = VerQueryValue(sBuffer(0), "\StringFileInfo\" + astr + "\FileDescription", lVerPointer, lVerbufferLen)
MoveMemory ab, lVerPointer, Len(ab)
Form1.CurrentX = 4
Form1.Print "文件描述";
Form1.CurrentX = 60
Form1.Print Left$(ab.astr, (InStr(ab.astr, Chr$(0)) - 1))

rc = VerQueryValue(sBuffer(0), "\StringFileInfo\" + astr + "\ProductName", lVerPointer, lVerbufferLen)
If rc Then
MoveMemory ab, lVerPointer, Len(ab)
Form1.CurrentX = 4
Form1.Print "产品名称";
Form1.CurrentX = 60
Form1.Print Left$(ab.astr, (InStr(ab.astr, Chr$(0)) - 1))
End If

rc = VerQueryValue(sBuffer(0), "\StringFileInfo\" + astr + "\OriginalFilename", lVerPointer, lVerbufferLen)
If rc Then
MoveMemory ab, lVerPointer, Len(ab)
Form1.CurrentX = 4
Form1.Print "文件原始名";
Form1.CurrentX = 60
Form1.Print Left$(ab.astr, (InStr(ab.astr, Chr$(0)) - 1))
End If

rc = VerQueryValue(sBuffer(0), "\StringFileInfo\" + astr + "\InternalName", lVerPointer, lVerbufferLen)
If rc Then
MoveMemory ab, lVerPointer, Len(ab)
Form1.CurrentX = 4
Form1.Print "文件内部名";
Form1.CurrentX = 60
Form1.Print Left$(ab.astr, (InStr(ab.astr, Chr$(0)) - 1))
End If

rc = VerQueryValue(sBuffer(0), "\StringFileInfo\" + astr + "\CompanyName", lVerPointer, lVerbufferLen)
If rc Then
MoveMemory ab, lVerPointer, Len(ab)
Form1.CurrentX = 4
Form1.Print "公司名称";
Form1.CurrentX = 60
Form1.Print Left$(ab.astr, (InStr(ab.astr, Chr$(0)) - 1))
End If

rc = VerQueryValue(sBuffer(0), "\StringFileInfo\" + astr + "\LegalCopyright", lVerPointer, lVerbufferLen)
If rc Then
MoveMemory ab, lVerPointer, Len(ab)
Form1.CurrentX = 4
Form1.Print "版权所有";
Form1.CurrentX = 60
Form1.Print Left$(ab.astr, (InStr(ab.astr, Chr$(0)) - 1))
End If
End Sub

Private Sub Command1_Click()
Form1.Cls

FullFileName = "c:\sun.exe"

If FullFileName = "" Then
Exit Sub
End If
Call DisplayVerInfo
End Sub
suntt 2003-11-03
  • 打赏
  • 举报
回复
接上面


Private Sub DisplayVerInfo()
'*** 这个子程序获取文件的版本信息 ****
Dim rc As Long
Dim lDummy As Long
Dim sBuffer() As Byte
Dim lBufferLen As Long
Dim lVerPointer As Long
Dim udtVerBuffer As VS_FIXEDFILEINFO
Dim lVerbufferLen As Long
Dim aBuffer() As Byte
Dim lAdd As Long
Dim astr As String
Dim lTran As Long

'*** Get size ****
lBufferLen = GetFileVersionInfoSize(FullFileName, lDummy)
If lBufferLen < 1 Then
MsgBox "无法获取文件版本信息!"
Exit Sub
End If

'**** 获取文件信息并且保存到udtVerBuffer结构中 ****
ReDim sBuffer(lBufferLen)
rc = GetFileVersionInfo(FullFileName, 0&, lBufferLen, sBuffer(0))
rc = VerQueryValue(sBuffer(0), "\", lVerPointer, lVerbufferLen)
MoveMemory udtVerBuffer, lVerPointer, Len(udtVerBuffer)

StrucVer = Format$(udtVerBuffer.dwStrucVersionh) & "." & _
Format$(udtVerBuffer.dwStrucVersionl)

'**** 获得文件版本 ****
FileVer = Format$(udtVerBuffer.dwFileVersionMSh) & "." & _
Format$(udtVerBuffer.dwFileVersionMSl) & "." & _
Format$(udtVerBuffer.dwFileVersionLSh) & "." & _
Format$(udtVerBuffer.dwFileVersionLSl)

'**** 获取产品版本 ****
ProdVer = Format$(udtVerBuffer.dwProductVersionMSh) & "." & _
Format$(udtVerBuffer.dwProductVersionMSl) & "." & _
Format$(udtVerBuffer.dwProductVersionLSh) & "." & _
Format$(udtVerBuffer.dwProductVersionLSl)

'**** 获取文件类型 ****
FileFlags = ""
If udtVerBuffer.dwFileFlags And VS_FF_DEBUG _
Then FileFlags = "Debug "
If udtVerBuffer.dwFileFlags And VS_FF_PRERELEASE _
Then FileFlags = FileFlags & "PreRel "
If udtVerBuffer.dwFileFlags And VS_FF_PATCHED _
Then FileFlags = FileFlags & "Patched "
If udtVerBuffer.dwFileFlags And VS_FF_PRIVATEBUILD _
Then FileFlags = FileFlags & "Private "
If udtVerBuffer.dwFileFlags And VS_FF_INFOINFERRED _
Then FileFlags = FileFlags & "Info "
If udtVerBuffer.dwFileFlags And VS_FF_SPECIALBUILD _
Then FileFlags = FileFlags & "Special "
If udtVerBuffer.dwFileFlags And VFT2_UNKNOWN _
Then FileFlags = FileFlags + "Unknown "
suntt 2003-11-03
  • 打赏
  • 举报
回复
刚刚看了程序,发现他写的并不是很正确。现在把全套的给你。


'这是一个获取文件信息的程序

Private Filename As String
Private Directory As String
Private FullFileName As String

Private StrucVer As String
Private FileVer As String
Private ProdVer As String
Private FileFlags As String
Private FileOS As String
Private FileType As String
Private FileSubType As String

Private Type VS_NEWINFO
astr As String * 1024
End Type

Private Type VS_FIXEDFILEINFO
dwSignature As Long
dwStrucVersionl As Integer
dwStrucVersionh As Integer
dwFileVersionMSl As Integer
dwFileVersionMSh As Integer
dwFileVersionLSl As Integer
dwFileVersionLSh As Integer
dwProductVersionMSl As Integer
dwProductVersionMSh As Integer
dwProductVersionLSl As Integer
dwProductVersionLSh As Integer
dwFileFlagsMask As Long
dwFileFlags As Long
dwFileOS As Long
dwFileType As Long
dwFileSubtype As Long
dwFileDateMS As Long
dwFileDateLS As Long
End Type

Private Declare Function GetFileVersionInfo Lib "Version.dll" Alias _
"GetFileVersionInfoA" (ByVal lptstrFilename As String, ByVal _
dwhandle As Long, ByVal dwlen As Long, lpData As Any) As Long
Private Declare Function GetFileVersionInfoSize Lib "Version.dll" Alias _
"GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, _
lpdwHandle As Long) As Long
Private Declare Function VerQueryValue Lib "Version.dll" Alias _
"VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, _
lplpBuffer As Any, puLen As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(dest As Any, ByVal Source As Long, ByVal length As Long)
Private Declare Function GetSystemDirectory Lib "kernel32" Alias _
"GetSystemDirectoryA" (ByVal Path As String, ByVal cbBytes As Long) As Long


Private Const VS_FFI_SIGNATURE = &HFEEF04BD
Private Const VS_FFI_STRUCVERSION = &H10000
Private Const VS_FFI_FILEFLAGSMASK = &H3F&


Private Const VS_FF_DEBUG = &H1
Private Const VS_FF_PRERELEASE = &H2
Private Const VS_FF_PATCHED = &H4
Private Const VS_FF_PRIVATEBUILD = &H8
Private Const VS_FF_INFOINFERRED = &H10
Private Const VS_FF_SPECIALBUILD = &H20


Private Const VOS_UNKNOWN = &H0
Private Const VOS_DOS = &H10000
Private Const VOS_OS216 = &H20000
Private Const VOS_OS232 = &H30000
Private Const VOS_NT = &H40000

Private Const VOS_BASE = &H0
Private Const VOS_WINDOWS16 = &H1
Private Const VOS_PM16 = &H2
Private Const VOS_PM32 = &H3
Private Const VOS_WINDOWS32 = &H4

Private Const VOS_DOS_WINDOWS16 = &H10001
Private Const VOS_DOS_WINDOWS32 = &H10004
Private Const VOS_OS216_PM16 = &H20002
Private Const VOS_OS232_PM32 = &H30003
Private Const VOS_NT_WINDOWS32 = &H40004


Private Const VFT_UNKNOWN = &H0
Private Const VFT_APP = &H1
Private Const VFT_DLL = &H2
Private Const VFT_DRV = &H3
Private Const VFT_FONT = &H4
Private Const VFT_VXD = &H5
Private Const VFT_STATIC_LIB = &H7


Private Const VFT2_UNKNOWN = &H0
Private Const VFT2_DRV_PRINTER = &H1
Private Const VFT2_DRV_KEYBOARD = &H2
Private Const VFT2_DRV_LANGUAGE = &H3
Private Const VFT2_DRV_DISPLAY = &H4
Private Const VFT2_DRV_MOUSE = &H5
Private Const VFT2_DRV_NETWORK = &H6
Private Const VFT2_DRV_SYSTEM = &H7
Private Const VFT2_DRV_INSTALLABLE = &H8
Private Const VFT2_DRV_SOUND = &H9
Private Const VFT2_DRV_COMM = &HA

suntt 2003-11-03
  • 打赏
  • 举报
回复
详细的内容你看
http://www.china-askpro.com/msg20/qa08.shtml
suntt 2003-11-03
  • 打赏
  • 举报
回复
用GetFileVersionInfo api函数
xyhv 2003-11-02
  • 打赏
  • 举报
回复
你在.exe文件的属性的版本就可以看到
代码下载链接: https://pan.quark.cn/s/90052d681b2f 本书系统地阐述了利用C语言进行程序开发的各种方法与技巧,全书总共分为十二个章节,涵盖了从基础到高级的多个方面,包括但不限于基础知识、指针运用、数据结构、算法设计、数学运算、文件处理、库函数应用、图形图像生成、系统调用、加密与安全机制、游戏开发以及综合案例等。整个书籍精心设计了三百个实例,每个实例都着重展示了其在实际应用中的价值。本书既适合作为C语言编程的入门教材供初学者研习,也能够为程序开发者、相关专业培训机构的教师和学生提供参考和借鉴。第一章聚焦于基础知识,详细介绍了进制转换、条件判断、多重循环图形打印、循环的数学应用、数组操作、字符与字符串处理、函数使用、趣味计算、宏定义与位运算等内容。第二章深入探讨了指针的相关知识,包括指针变量、指针与数组的关系、指针与函数的交互、字符串与指针的结合以及指向指针的指针运用。第三章着重于数据结构的学习,涵盖了结构体、链表、栈与队列、串与广义表、二叉树以及图及其应用等多个重要主题。第四章详细介绍了算法设计,涉及简单问题求解算法、排序算法、查找算法、数学定理与猜想以及逻辑推理与判断等内容。第五章围绕数学应用展开,讨论了素数问题、整数趣题、数学问题求解、矩阵运算以及生活中的数学实例。第六章专门讲解文件操作,包括了文件读写操作、文件内容处理、文件的创建与查找删除、以及文件相关操作等。第七章介绍了库函数的调用,涵盖了时间转换与操作函数、数学函数、字符串与字符函数以及其他各类函数的使用方法。第八章则聚焦于图形图像的处理,详细介绍了基本图形的绘制、色彩填充与使用技巧等。

7,787

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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