Avatar billede zerohero Nybegynder
08. september 2004 - 13:19 Der er 4 kommentarer og
2 løsninger

Genkendelse af DLL filer

Jeg har en række filer i en mappe! Spørgsmålet er, hvordan jeg kan vide om en tilfældig fil er en DLL-fil eller ej! (Vel og mærket uden at skulle kigge på filens efternavn)!

Hvis jeg bruger funktionen LoadLibrary() opstår en fejl meddelse, meget naturligt, når filen ikke er en DLL-fil! Denne fejlmeddelse vil jeg gerne ungå og tænkte at man selv kunne checke om en fil er af typen DLL eller ej!
Avatar billede snowball Novice
08. september 2004 - 13:25 #1
Du kunne jo evt. smide din LoadLibrary ind i en Try / Except. Så undgår du at brugerne får vist en "grim" fejl :)

Try
  LoadLibrary();
  //Kommer vi hertil er det en DLL fil
Except
  //Kommer vi hertil er det IKKE en DLL fil eller der er sket en anden fejl
End;
Avatar billede zerohero Nybegynder
08. september 2004 - 13:35 #2
Fejlmeddelsen kommer a ligevel :(
Da det IKKE er en fejlmeddelse der bliver "raised" af Delphi, men af Windows!
Avatar billede stoney Nybegynder
08. september 2004 - 14:10 #3
Avatar billede borrisholt Novice
08. september 2004 - 14:20 #4
LoadLibrary Retunerer 0 hvis det enten ikke er en DLL fil eller ikke er mulig at loade den .. Se etv MSDN

Ellers kig lidt på det her, det burde kunne indspirere dig til noget :

Type
  TExetype = ( etUnknown, etDOS, etWinNE, etWinPE );
  TExeStrings = Array [TExetype] of String[30];

const
  ExeStrings : TExeStrings =
    ('Unknown file type',
    'Dos executable',
    'Windows 16 bit executable',
    'Windows 32 bit executable'
    );


Function GetExetype( Const fname: String ): TExetype;
Var
  Signature: Word;
  WinHdrOffset: Word;
  Fexe:  TFileStream;
Begin
  result := etUnknown;
  Fexe := TFileStream.Create( fname, fmOpenRead or fmShareDenyNone);
  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; { If }
  end; { If }
  Fexe.Free;
End;


Jens B
Avatar billede zerohero Nybegynder
08. september 2004 - 14:28 #5
Stney>> Perfekt! :D Smid et svar!
Avatar billede stoney Nybegynder
08. september 2004 - 14:28 #6
:-)

Stoney
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester