Announcement

Collapse
No announcement yet.

Laufzeitfehler unter Win9x/Me / Keine Probleme unter WinNT4/Win2k

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Laufzeitfehler unter Win9x/Me / Keine Probleme unter WinNT4/Win2k

    Hallo zusammen!

    Ich entwickle zur Zeit eine Anwendung, die unter anderem rekursiv die Versionsinformationen von Dateien ausliest und in eine Liste schreibt.

    Nun habe ich folgendes Problem:

    Starte ich das Programm unter Win9x/Me, so erhalte ich eine Exception:
    "Zugriffsverletzung bei Adresse 00409B3B in Modul 'MeinProgramm.exe'. Lesen von Adresse FFFFFFFF."

    Dieses Verhalten tritt sowohl mit als auch ohne Delphi-Entwicklungsumgebung (IDE) auf.

    Lasse ich in der IDE jedoch das Programm in Einzelschritten laufen, so funktioniert es plötzlich auch unter Win9x/Me ohne Probleme.

    Unter WinNT4/Win2k läuft das Ganze in allen Varianten ohne Probleme!!!

    Weiß jemand einen Rat oder kennt die Ursache dieses Problems?

    Gruss
    Michael

  • #2
    Hallo,

    wenn das Programm beim schrittweisen Durchlaufen im Debugger problemlos läuft, stellt sich die Frage, <b>zu welchem Zeitpunkt</b> und <b>wie</b> diese Funktion im Programm aufgerufen wird

    Comment


    • #3
      Hallo Andreas,

      hier nun die betreffenden Routinen.

      Die Exception tritt beim Zugriff auf die Unterroutine FileInfo auf (in der Main-Routine mit #!!!# gekennzeichnet, wobei der Fehler dabei in verschiedenen Zeilen auftreten kann):

      // Sub-Routine

      function FileInfo(NameApp,Value : string; var Language:String) : string;

      var dump : DWORD;

      size : DWORD;

      buffer : PChar;

      VersionPointer : PChar;

      TransBuffer : PChar;

      Temp,

      TempLang,

      TempCode : integer;

      CalcLangCharSet: string;

      begin

      size := GetFileVersionInfoSize(PChar(NameApp), dump);

      if size<>0 then begin

      GetMem(buffer,size+1);

      try

      GetFileVersionInfo(PChar(NameApp), 0, size, buffer);

      VerQueryValue(buffer, PChar('\VarFileInfo\Translation'), pointer
      (TransBuffer), dump);

      Language:='n/a';

      if dump >= 4 then

      begin

      temp:=0;

      StrLCopy(@temp, TransBuffer, 2);

      TempLang:=temp;

      CalcLangCharSet:=IntToHex(temp, 4);

      StrLCopy(@temp, TransBuffer+2, 2);

      TempCode:=temp;

      CalcLangCharSet := CalcLangCharSet+IntToHex(temp, 4);

      SetLength(language, 256);

      VerLanguageName(TempLang, PChar(language), 256);

      SetLength(language, StrLen(PChar(language)));

      Language:=Language+' / Subcode: '+IntToStr(TempCode);

      end;

      VerQueryValue(buffer, pchar
      ('\StringFileInfo\'+CalcLangCharSet+'\'+value), pointer
      (VersionPointer), dump);

      if (dump > 1) then

      begin

      SetLength(Result, dump);

      StrLCopy(Pchar(Result), VersionPointer, dump);

      Result:=copy(Result,1,pos(#0,Result)-1);

      if Length(Result)>0 then begin

      SearchReplaceEinzel(Result,#26,#32);

      SearchReplaceEinzel(Result,#13,#32);

      SearchReplaceEinzel(Result,#10,#32);

      end

      else

      Result:='n/a'

      end

      else Result := 'n/a';

      finally

      FreeMem(buffer)

      end;

      end

      else

      begin

      Language:='n/a';

      Result:='n/a';

      end;

      end;

      &#10

      Comment


      • #4
        // Main-Routine

        procedure GetAllFiles(mask:string);

        var Search: TSearchrec;

        verz : string;

        such : string;

        size : string;

        date : string;

        lang : string;

        attr : string;

        maxv,

        maxd : int64;

        begin

        such := ExtractFileName(mask);

        verz := ExtractFilepath(mask);

        if verz[length(verz)]<>'\' then verz := verz + '\';

        { alle Dateien suchen }

        if FindFirst(mask, $3F, Search)= 0 then repeat

        if SecuritySnapshot.Checked then

        Zeitmessung_Zwischenzeit(Translate('Dateien-/Security-Snapshot
        wird erzeugt...','',8013),400)

        else

        Zeitmessung_Zwischenzeit(Translate('Dateien-Snapshot wird
        erzeugt...','',8014),400);

        if EventHandle=27 then begin

        EventHandle:=-1;

        if break then begin

        Zeitmessung_Ende(true,true);

        Abbruch:=true;

        geladenerSnapshot.Caption:='';

        exit;

        end;

        EventHandle:=0;

        end;

        if (Search.attr and fadirectory)=fadirectory then begin

        if (Search.Name<>'.') and (Search.Name<>'..') then begin

        bcount:=bcount+Search.Size;

        size:=IntToStr(Search.Size);

        while Length(size)<10 do

        size:=' '+size;

        date:=DateTimeToStr(FileDateToDateTime(Search.Time ));

        while Length(date)<19 do

        date:=date+' ';

        Application.ProcessMessages;

        listbox1.items.add(verz+Search.Name);

        writeln(Snapdatei,directory);

        writeln(Snapdatei,verz);

        writeln(Snapdatei,Search.Name);

        writeln(Snapdatei,date);

        writeln(Snapdatei,size);

        writeln(Snapdatei,'DIR');

        attr:='------';

        if ((search.attr and fareadonly)=fareadonly) then Attr
        [1]:='R';

        if ((search.attr and fahidden)=fahidden) then Attr[2]:='H';

        if ((search.attr and fasysfile)=fasysfile) then Attr[3]:='S';

        if ((search.attr and favolumeid)=favolumeid) then Attr
        [4]:='V';

        if ((search.attr and fadirectory)=fadirectory) then Attr
        [5]:='D';

        if ((search.attr and faarchive)=faarchive) then Attr[6]:='A';

        writeln(Snapdatei,attr);

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'CompanyName',lang)); #!!!#

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'FileDescription',lang)); #!!!#

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'FileVersion',lang)); #!!!#

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'InternalName',lang)); #!!!#

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'LegalCopyright',lang)); #!!!#

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'OriginalFilename',lang)); #!!!#

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'ProductName',lang)); #!!!#

        writeln(Snapdatei,FileInfo
        (Verz+Search.Name,'ProductVersion',lang)); #!!!#

        writeln(Snapdatei,lang);

        if Pruefsummengenerieren.Checked then

        writeln(Snapdatei,Ermittle_Pruefsumme(verz+Search. Name))

        else

        writeln(Snapdatei,'n/a (CRC32)');

        inc(vcount)

        end

        end else
        &#10

        Comment


        • #5
          // Teil 2 Main-Routine

          begin

          bcount:=bcount+Search.Size;

          size:=IntToStr(Search.Size);

          while Length(size)<10 do

          size:=' '+size;

          date:=DateTimeToStr(FileDateToDateTime(Search.Time ));

          if Length(date)=10 then

          date:=date+' 00:00:00';

          while Length(date)<19 do

          date:=date+' ';

          Application.ProcessMessages;

          listbox1.items.add(verz+Search.Name);

          writeln(Snapdatei,directory);

          writeln(Snapdatei,verz);

          writeln(Snapdatei,Search.Name);

          writeln(Snapdatei,date);

          writeln(Snapdatei,size);

          writeln(Snapdatei,'FILE');

          attr:='------';

          if ((search.attr and fareadonly)=fareadonly) then Attr[1]:='R';

          if ((search.attr and fahidden)=fahidden) then Attr[2]:='H';

          if ((search.attr and fasysfile)=fasysfile) then Attr[3]:='S';

          if ((search.attr and favolumeid)=favolumeid) then Attr[4]:='V';

          if ((search.attr and fadirectory)=fadirectory) then Attr
          [5]:='D';

          if ((search.attr and faarchive)=faarchive) then Attr[6]:='A';

          writeln(Snapdatei,attr);

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'CompanyName',lang)); #!!!#

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'FileDescription',lang)); #!!!#

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'FileVersion',lang)); #!!!#

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'InternalName',lang)); #!!!#

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'LegalCopyright',lang)); #!!!#

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'OriginalFilename',lang)); #!!!#

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'ProductName',lang)); #!!!#

          writeln(Snapdatei,FileInfo
          (Verz+Search.Name,'ProductVersion',lang)); #!!!#

          writeln(Snapdatei,lang);

          if Pruefsummengenerieren.Checked then

          writeln(Snapdatei,Ermittle_Pruefsumme(verz+Search. Name))

          else

          writeln(Snapdatei,'n/a (CRC32)');

          inc(dcount)

          end;

          until (FindNext(Search)<>0) or (vcount>=maxv) or (dcount>=maxd);

          { Unterverzeichnisse durchsuchen }

          if FindFirst(verz + '*.*',fadirectory, Search)= 0 then

          repeat

          if((search.attr and fadirectory)=fadirectory)and(search.name[1]
          <>'.') then GetAllFiles(verz+ Search.Name + '\' + such);

          until FindNext(Search) <> 0;

          FindClose(Search);

          end

          Comment

          Working...
          X