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.