function GetEXEType(FileName: string): string; var BinaryType: DWORD; begin
if GetBinaryType(PChar(FileName), Binarytype) then
case BinaryType of SCS_32BIT_BINARY: Result := 'Win32 executable';
SCS_DOS_BINARY: Result := 'DOS executable';
SCS_WOW_BINARY: Result := 'Win16 executable';
SCS_PIF_BINARY: Result := 'PIF file';
SCS_POSIX_BINARY: Result := 'POSIX executable';
SCS_OS216_BINARY: Result := 'OS/2 16 bit executable' else Result := 'unknown executable' end
else Result := 'File is not an executable'; end;
procedure TForm1.Button1Click(Sender: TObject); begin label1.Caption := GetEXEType('c:\windows\notepad.exe'); end;
{
Windows NT/2000: Requires Windows NT 3.5 or later.
Windows 95/98: Unsupported.
}
type TExeType = (etUnknown, etDOS, etWinNE {16-bit}, etWinPE {32-bit});
function GetExeType(const FileName: string): TExeType; { func to return the type of executable or dll (DOS, 16-bit, 32-bit). }
(**************************************************************
Usage:
with OpenDialog1 do
if Execute then
begin
Label1.Caption := FileName;
Label2.Caption := ExeStrings[GetExetype(FileName)];
end;
- or -
case GetExeType(OpenDialog1.FileName) of
etUnknown: Label3.Caption := 'Unknown file type';
etDOS : Label3.Caption := 'DOS executable';
etWinNE : {16-bit} Label3.Caption := 'Windows 16-bit executable';
etWinPE : {32-bit} Label3.Caption := 'Windows 32-bit executable';
end;
***************************************************************) var Signature,
WinHdrOffset: Word;
fexe: TFileStream; begin Result := etUnknown; try fexe := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); try fexe.ReadBuffer(Signature, SizeOf(Signature)); if Signature = $5A4D { 'MZ' } then
begin Result := etDOS;
fexe.Seek($18, soFromBeginning);
fexe.ReadBuffer(WinHdrOffset, SizeOf(WinHdrOffset)); if WinHdrOffset >= $40 then
begin fexe.Seek($3C, soFromBeginning);
fexe.ReadBuffer(WinHdrOffset, SizeOf(WinHdrOffset));
fexe.Seek(WinHdrOffset, soFrombeginning);
fexe.ReadBuffer(Signature, SizeOf(Signature)); if Signature = $454E { 'NE' } then Result := etWinNE else
if Signature = $4550 { 'PE' } then Result := etWinPE; end; end; finally fexe.Free; end; except
end; end;
procedure TForm1.Button1Click(Sender: TObject); begin
if OpenDialog1.Execute then
case GetExeType(OpenDialog1.FileName) of etUnknown: Label_ExeType.Caption := 'Unknown file type';
etDOS : Label_ExeType.Caption := 'DOS executable';
etWinNE : Label_ExeType.Caption := 'Windows 16-bit executable';
etWinPE : Label_ExeType.Caption := 'Windows 32-bit executable'; end; end;