首页  编辑  

检测可执行文件类型

Tags: /超级猛料/Stream.File.流、文件和目录/文件操作/   Date Created:

可以使用API函数:SHGetFileInfo,参数:SHGFI_EXETYPE

************************************

Here is a function from Peter Below:

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;