
Title: How to use functions in VER.DLL -- a Sample Application 
Document Number: Q112731           Publ Date: 25-APR-1994 
Product Name: Microsoft Visual Basic 
Product Version:  2.00 3.00 
Operating System: WINDOWS



 ------------------------------------------------------------------ 
 The information in this article applies to:


 - Standard and Professional Editions of Microsoft Visual Basic 
   for Windows, versions 2.0 and 3.0 
 ------------------------------------------------------------------


 SUMMARY 
 =======


 This article contains code and instructions that show you how to 
 create a sample application that uses some of the functions in VER.DLL 
 to retrieve file information embedded into a file with the resource 
 compiler (RC.EXE).


 This Visual Basic applicatin was modeled after the Verstamp sample 
 program included in the Microsoft Windows Software Development Kit (SDK).


 Additional information can be found in the following documents:


  - Microsoft Windows 3.1 Programmer's Reference, Vols. 2 & 3 
  - Microsoft SDK Reference Help File (WIN31WH.HLP) from Windows 3.1 SDK 
    or the Professional Edition of Visual Basic version 2.0 or 3.0.


 MORE INFORMATION 
 ================


 Instead of offering this article in a number of steps, we have modified 
 our usual format to make it easier for you to create and use this Visual 
 Basic application. Therefore, the three files you need (VERINFO.BAS, 
 VERINFO1.FRM, VERINFO2.FRM) are listed below so you can easily copy them 
 into a text editor and save them as separate files. Instructions for how 
 to use the files are embedded in the files as comments.


 VERINFO.BAS 
 -----------


 ' Place the following code in a single text file called VERINFO.BAS 
 ' 
 ' The Global constants below are defined in the VER.H header file, also 
 ' included in Microsoft C/C++ 7.0, and the Windows SDK. 
 ' 
 ' NOTE: After copying this into a file in a text editor, modify each 
 ' Declare statements so that each one uses only one, single line.


 Type VS_VERSION 
    wLength            As Integer 
    wValueLength       As Integer 
    szKey              As String * 16 ' "VS_VERSION_INFO" 
    dwSignature        As Long        ' VS_FIXEDFILEINFO struct 
    dwStrucVersion     As Long 
    dwFileVersionMS    As Long 
    dwFileVersionLS    As Long 
    dwProductVersionMS As Long 
    dwProductVersionLS As Long 
    dwFileFlagsMasks   As Long 
    dwFileFlags        As Long 
    dwFileOS           As Long 
    dwFileType         As Long 
    dwFileSubType      As Long 
    dwFileDateMS       As Long 
    dwFileDateLS       As Long 
 End Type


 Declare Function GetFileVersionInfo% Lib "Ver.dll" (ByVal Filename$, 
    ByVal dwhandle&, ByVal cbBuff&, ByVal lpvData$) 
 Declare Function GetFileVersionInfoSize& Lib "Ver.dll" 
    (ByVal Filename$, dwhandle&) 
 Declare Sub hmemcpy Lib "kernel" (hpvDest As Any, hpvSrc As Any, 
    ByVal cbBytes&) 
 Declare Function GetSystemDirectory% Lib "kernel" 
    (ByVal Path$, ByVal cbBytes%)


 ' **** VS_VERSION.dwFileFlags **** 
 Global Const VS_FF_DEBUG = &H1& 
 Global Const VS_FF_PRERELEASE = &H2& 
 Global Const VS_FF_PATCHED = &H4& 
 Global Const VS_FF_PRIVATEBUILD = &H8& 
 Global Const VS_FF_INFOINFERRED = &H10&
 Global Const VS_FF_SPECIALBUILD = &H20&


 ' **** VS_VERSION.dwFileOS **** 
 Global Const VOS_UNKNOWN = &H0& 
 Global Const VOS_DOS = &H10000 
 Global Const VOS_OS216 = &H20000 
 Global Const VOS_OS232 = &H30000 
 Global Const VOS_NT = &H40000


 Global Const VOS__BASE = &H0& 
 Global Const VOS__WINDOWS16 = &H1& 
 Global Const VOS__PM16 = &H2& 
 Global Const VOS__PM32 = &H3& 
 Global Const VOS__WINDOWS32 = &H4&


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


 ' **** VS_VERSION.dwFileType **** 
 Global Const VFT_UNKNOWN = &H0& 
 Global Const VFT_APP = &H1& 
 Global Const VFT_DLL = &H2& 
 Global Const VFT_DRV = &H3& 
 Global Const VFT_FONT = &H4& 
 Global Const VFT_VXD = &H5& 
 Global Const VFT_STATIC_LIB = &H7&


 ' **** VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV **** 
 Global Const VFT2_UNKNOWN = &H0& 
 Global Const VFT2_DRV_PRINTER = &H1& 
 Global Const VFT2_DRV_KEYBOARD = &H2& 
 Global Const VFT2_DRV_LANGUAGE = &H3& 
 Global Const VFT2_DRV_DISPLAY = &H4& 
 Global Const VFT2_DRV_MOUSE = &H5& 
 Global Const VFT2_DRV_NETWORK = &H6& 
 Global Const VFT2_DRV_SYSTEM = &H7& 
 Global Const VFT2_DRV_INSTALLABLE = &H8& 
 Global Const VFT2_DRV_SOUND = &H9& 
 Global Const VFT2_DRV_COMM = &HA&


 ' **** VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT **** 
 Global Const VFT2_FONT_RASTER = &H1& 
 Global Const VFT2_FONT_VECTOR = &H2& 
 Global Const VFT2_FONT_TRUETYPE = &H3&


 ' **** Global variables used in both forms **** 
 Global Filename$ 
 Global Directory$ 
 Global FileVer$ 
 Global ProdVer$ 
 Global FileFlags$ 
 Global FileOS$ 
 Global FileType$ 
 Global FileSubType$


 VERINFO1.FRM 
 ------------


 ' The following is a text dump of the form VERINFO1. It includes the form 
 ' and control description as well as necessary Function and Sub procedures. 
 ' Save the code in a single TEXT file called VERINFO1.FRM and you will 
 ' be able to load it as a form in Visual Basic. 
 ' 
 ' NOTE: To make the code fit in this article, some of the lines are listed 
 ' using multiple lines. After copying the code into a file in a text editor 
 ' modify it to ensure that all lines of code exist as one, single line 
 ' in the file. Otherwise, you will receive errors when loading the form in 
 ' Visual Basic.


 Begin Form Form1 
    BorderStyle     =   1  'Fixed Single 
    Caption         =   "VerInfo Demo" 
    ClientHeight    =   4290 
    ClientLeft      =   2340 
    ClientTop       =   2160 
    ClientWidth     =   3855 
    Height          =   4695 
    Left            =   2280 
    LinkMode        =   1  'Source 
    LinkTopic       =   "Form1" 
    ScaleHeight     =   17.875 
    ScaleMode       =   4  'Character 
    ScaleWidth      =   32.125 
    Top             =   1815 
    Width           =   3975 
    Begin DriveListBox Drive1 
       Height          =   288 
       Left            =   1836 
       TabIndex        =   7 
       Top             =   3792 
       Width           =   1908 
    End 
    Begin DirListBox Dir1 
       Height          =   1884 
       Left            =   1830 
       TabIndex        =   5 
       Top             =   1428 
       Width           =   1896 
    End 
    Begin FileListBox File1 
       Height          =   2955 
       Left            =   120 
       TabIndex        =   3 
       Top             =   984 
       Width           =   1575 
    End 
    Begin TextBox Text1 
       Height          =   288 
       Left            =   1092 
       TabIndex        =   1 
       Text            =   "*.*" 
       Top             =   204 
       Width           =   2544 
    End 
    Begin Label Label1 
       Caption         =   "Dri&ves:" 
       Height          =   216 
       Index           =   4 
       Left            =   1830 
       TabIndex        =   6 
       Top             =   3480 
       Width           =   660 
    End 
    Begin Label Label1 
       Caption         =   "&Directories:" 
       Height          =   192 
       Index           =   3 
       Left            =   1830 
       TabIndex        =   4 
       Top             =   1104 
       Width           =   1236 
    End 
    Begin Label Label1 
       Caption         =   "c:\" 
       Height          =   204 
       Index           =   2 
       Left            =   1830 
       TabIndex        =   8 
       Top             =   648 
       Width           =   1884 
    End 
    Begin Label Label1 
       Caption         =   "&Files:" 
       Height          =   204 
       Index           =   0 
       Left            =   120 
       TabIndex        =   2 
       Top             =   648 
       Width           =   612 
    End 
    Begin Label Label1 
       Caption         =   "File&Name:" 
       Height          =   204 
       Index           =   1 
       Left            =   120 
       TabIndex        =   0 
       Top             =   252 
       Width           =   936 
    End 
 End


 Sub Dir1_Change () 
    File1.Path = Dir1.Path 
    Label1(2).Caption = File1.Path 
 End Sub

b Sub DisplayVerInfo () 
    Dim X As VS_VERSION


    '*** Get Version Info **** 
    FileVer$ = "": ProdVer$ = "": FileFlags$ = "" 
    FileOS$ = "": FileType$ = "": FileSubType$ = "" 
    FileName$ = File1.List(File1.ListIndex) 
    Directory$ = Label1(2).Caption 
    FullFileName$ = Label1(2).Caption + "\" + FileName$ 
    BufSize& = GetFileVersionInfoSize(FullFileName$, dwHandle&) 
    If BufSize& = 0 Then 
       MsgBox "No Version Info available!" 
       Exit Sub 
    End If 
    lpvData$ = Space$(BufSize&) 
    r% = GetFileVersionInfo(FullFileName$, dwHandle&, BufSize&, lpvData$) 
    hmemcpy X, ByVal lpvData$, Len(X)


    '**** Determine File Version number **** 
    FileVer$ = LTrim$(Str$(HIWORD(X.dwFileVersionMS))) + "." 
    FileVer$ = FileVer$ + LTrim$(Str$(LOWORD(X.dwFileVersionMS))) + "." 
    FileVer$ = FileVer$ + LTrim$(Str$(HIWORD(X.dwFileVersionLS))) + "." 
    FileVer$ = FileVer$ + LTrim$(Str$(LOWORD(X.dwFileVersionLS)))


    '**** Determine Product Version number **** 
    ProdVer$ = LTrim$(Str$(HIWORD(X.dwFileVersionMS))) + "." 
    ProdVer$ = ProdVer$ + LTrim$(Str$(LOWORD(X.dwProductVersionMS))) + "." 
    ProdVer$ = ProdVer$ + LTrim$(Str$(HIWORD(X.dwProductVersionLS))) + "." 
    ProdVer$ = ProdVer$ + LTrim$(Str$(LOWORD(X.dwProductVersionLS)))


    '**** Determine Boolean attributes of File **** 
    If X.dwFileFlags And VS_FF_DEBUG Then FileFlags$ = "DeBug" 
    If X.dwFileFlags And VS_FF_PRERELEASE Then FileFlags$ = 
       FileFlags$ + "PreRel" 
    If X.dwFileFlags And VS_FF_PATCHED Then FileFlags$ = 
       FileFlags$ + "Patched" 
    If X.dwFileFlags And VS_FF_PRIVATEBUILD Then FileFlags$ = 
       FileFlags$ +  "Private" 
    If X.dwFileFlags And VS_FF_INFOINFERRED Then FileFlags$ = 
       FileFlags$ + "Info" 
    If X.dwFileFlags And VS_FF_DEBUG Then FileFlags$ = 
       FileFlags$ + "Special"


    If X.dwFileFlags And &HFFFFFF00 Then FileFlags$ = FileFlags$ + "Unknown"


    '**** Determine OS for which file was designed **** 
    Select Case X.dwFileOS 
       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-32 PM-32" 
       Case VOS_NT_WINDOWS32 
          FileOS$ = "NT-Win32" b       Case Else 
          FileOS$ = "Unknown" 
    End Select



    '**** Determine Type and SubType of File **** 
    Select Case X.dwFileType 
       Case VFT_APP 
          FileType$ = "App" 
       Case VFT_DLL 
          FileType$ = "DLL" 
       Case VFT_DRV 
          FileType$ = "Driver" 
          Select Case X.dwFileSubType 
             Case VFT2_DRV_PRINTER 
                FileSubType$ = "Printer drv" 
             Case VFT2_DRV_KEYBOARD 
                FileSubType$ = "Keyboard drv" 
             Case VFT2_DRV_LANGUAGE 
                FileSubType$ = "Language drv" 
             Case VFT2_DRV_DISPLAY 
                FileSubType$ = "Display drv" 
             Case VFT2_DRV_MOUSE 
                FileSubType$ = "Mouse drv" 
             Case VFT2_DRV_NETWORK 
                FileSubType$ = "Network drv" 
ALLABLE 
                FileSubType$ = "Installable" 
             Case VFT2_DRV_SOUND 
                FileSubType$ = "Sound drv" 
             Case VFT2_DRV_COMM 
                FileSubType$ = "Comm drv" 
             Case VFT2_UNKNOWN 
                FileSubType$ = "Unknown" 
          End Select 
       Case VFT_FONT 
          FileType$ = "Font" 
          Select Case X.dwFileSubType 
             Case VFT_FONT_RASTER 
                FileSubType$ = "Raster Font" 
             Case VFT_FONT_VECTOR 
                FileSubType$ = "Vector Font" 
             Case VFT_FONT_TRUETYPE 
                FileSubType$ = "TrueType Font" 
          End Select 
       Case VFT_VXD 
          FileType$ = "VxD" 
       Case VFT_STATIC_LIB 
          FileType$ = "Lib" 
       Case Else 
          FileType$ = "Unknown" 
    End Select


    Form2.Show 1 
 End Sub


 Sub Drive1_Change () 
    Dir1.Path = Drive1.Drive 
    File1.Path = Dir1.Path 
    Label1(2).Caption = File1.Path 
 End Sub


 Sub File1_Click () 
    Text1.Text = File1.List(File1.ListIndex) 
 End Sub


 Sub File1_DblClick () 
    DisplayVerInfo 
 End Sub


 Sub File1_PathChange () 
    Text1.Text = "*.*" 
    File1.Pattern = "*.*" 
 End Sub


 Sub Form_Load () 
    Dim Buffer$


    ' **** Set Default Dir to Windows System Subdirectory **** 
    Buffer$ = Space$(256) 
    r% = GetSystemDirectory(Buffer$, Len(Buffer$)) 
    Dir1.Path = Buffer$ 
    File1.Path = Buffer$ 
    Drive1.Drive = Left$(Buffer$, 1) 
 End Sub


 Function HIWORD (X As Long) As Integer 
    HIWORD = X \ &HFFFF& 
 End Function


 Function LOWORD (X As Long) As Integer 
    LOWORD = X And &HFFFF& 
 End Function


 Sub Text1_KeyPress (KeyAscii As Integer) 
    If KeyAscii = 13 Then 
       File1.Pattern = Text1.Text 
       KeyAscii = 0 
       If File1.ListCount = 1 Then DisplayVerInfo 
       If File1.ListCount = 0 Then 
          MsgBox "Invalid Filename" 
          File1.Pattern = "*.*" 
          Text1.Text = "*.*" 
       End If 
       File1.SetFocus 
    End If 
 End Sub



 VERINFO2.FRM 
 ------------


 ' The following is a text dump of the form VERINFO2. It includes the form 
 ' and control description as well as necessary Function and Sub procedures. 
 ' Save the code in a single text file called VERINFO2.FRM and you will 
 ' be able to load it as a form in Visual Basic. 
 ' 
 VERSION 2.00 
 Begin Form Form2 
    BorderStyle     =   1  'Fixed Single 
    Caption         =   "File Version Info" 
    ClientHeight    =   3345 
    ClientLeft      =   6630 
    ClientTop       =   2175 
    ClientWidth     =   4500 
    FontBold        =   0   'False 
    FontItalic      =   0   'False 
    FontName        =   "MS Sans Serif" 
    FontSize        =   8.25 
    FontStrikethru  =   0   'False 
    FontUnderline   =   0   'False 
    Height          =   3750 
    Left            =   6570 
    LinkMode        =   1  'Source 
    LinkTopic       =   "Form3" 
    MaxButton       =   0   'False 
    MinButton       =   0   'False 
    ScaleHeight     =   13.938 
    ScaleMode       =   4  'Character 
    ScaleWidth      =   37.5 
    Top             =   1830 
    Width           =   4620 
    Begin CommandButton Command1 
       Caption         =   "OK" 
       Height          =   372 
       Left            =   1680 
       TabIndex        =   0 
       Top             =   2880 
       Width           =   1452 
    End 
 End


 Sub Command1_Click () 
    Form2.Hide 
 End Sub


 Sub Command1_GotFocus () 
   Form_Paint 
 End Sub


 Sub Form_Paint () 
    Form2.CurrentX = 2
    Form2.CurrentY = 1 
    Form2.Print "FileName:" 
    Form2.CurrentX = 2 
    Form2.Print "Directory:" 
    Form2.CurrentX = 2 
    Form2.Print "File Version:" 
    Form2.CurrentX = 2 
    Form2.Print "Product Version:" 
    Form2.CurrentX = 2 
    Form2.Print "File Flags:" 
    Form2.CurrentX = 2 
    Form2.Print "File OS:" 
    Form2.CurrentX = 2 
    Form2.Print "File Type:" 
    Form2.CurrentX = 2 
    Form2.Print "File Sub-type:"


    Form2.CurrentX = 18 
    Form2.CurrentY = 1 
    Form2.Print FileName$ 
    Form2.CurrentX = 18 
    Form2.Print Directory$ 
    Form2.CurrentX = 18 
    Form2.Print FileVer$ 
    Form2.CurrentX = 18 
    Form2.Print ProdVer$ 
    Form2.CurrentX = 18 
    Form2.Print FileFlags$ 
    Form2.CurrentX = 18 
    Form2.Print FileOS$ 
    Form2.CurrentX = 18 
    Form2.Print FileType$ 
    Form2.CurrentX = 18 
    Form2.Print FileSubType$ 
 End Sub


 How to Create and Run the Program 
 ---------------------------------


 1. Start Visual Basic. Form1 is created by default.


 2. From the File menu, choose Remove File to remove Form1.


 3. From the File menu, choose Add File... to and add VERINFO.BAS


 4. Repeat step 3 to add VERINFO1.FRM and VERINFO2.FRM to the project.


 5. From the Options menu, choose Project... and set Start Up Form 
    to Form1.


 6. Run the application.


 Additional reference words: 2.00 3.00 codesmpl 
 KBCategory: APrg 
 KBSubCategory: APrgWindow


COPYRIGHT Microsoft Corporation, 1994.
