devxlogo

Determine whether a program is 16- or 32-bit

Determine whether a program is 16- or 32-bit

Even if we’re living in a 32-bit world, and closer and closer to the 64-bit day, 16-bit programs are still running out there. Knowing whether a given EXE is 32-bit or not can be useful when you have to arrange version checking routine, for example to detect which version of a product is installed.

The Win32 SDK makes available a multi-use function called SHGetFileInfo() that serves the purpose. It is declared like this:

Type SHFILEINFO   hIcon As Long   iIcon As Long   dwAttributes As Long   szDisplayName As String * MAX_PATH   szTypeName As String * 80End TypePublic Const SHGFI_EXETYPE = &H2000Public Declare Function SHGetFileInfo Lib "shell32.dll" Alias "SHGetFileInfoA" _    ( ByVal pszPath As String, ByVal dwFileAttributes As Long, _    psfi As SHFILEINFO, ByVal cbFileInfo As Long, ByVal uFlags As Long ) As _    Long 

Its usage is:

dw = SHGetFileInfo(exename, 0, sfi, Len(sfi), SHGFI_EXETYPE)

The returned low word contains the signature of the executable. You must compare it against the following values:

Const WIN32_GUI = &H4550   ' PE, Win32Const WIN16_GUI = &H454E   ' NE, Win16Const WIN16_DOS = &H5A4D   ' MZ, MS-DOS

You can obtain the low word in this way:

dw = SHGetFileInfo(exename, 0, sfi, Len(sfi), SHGFI_EXETYPE)lowWord = dw And &H7FFF

This tip is taken from the book VisualC++ Windows Shell Programming by Dino Esposito.

devx-admin

Share the Post: