Getting EXE type (16/32 bit Windows or DOS)
   


Here's a function to return the platform the executable was designed for (16/32 bit Windows or DOS). Read the comment for the usage. This function works as well with DLLs, COMs, and maybe others. Thanks to Peter Below for this code.

type
  TExeType = (etUnknown, etDOS, etWinNE {16-bit}, etWinPE {32-bit}); 
  TExeStrings = array[TExetype] of string[30];


function
GetExeType(const FileName: string): TExeType;
{ func to return the type of executable or dll (DOS, 16-bit, 32-bit). }
{ Thanks to Peter Below (TeamB) <[email protected]> for this code. }
(**************************************************************
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;



Blue Orb Software

[email protected]