Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Floppy Image schreiben endet mit einer Access Violation

  Alt 17. Okt 2003, 17:02
Ich habe eien Funktion, die mir ein Image von einer Floppy erstellt:
Delphi-Quellcode:
function WriteFile(Filename: string): Integer;
var
  SrcDrive: string;
  hDrive: THandle;
  Geometry: DISK_GEOMETRY;
  hFile: THandle;
  IOBuffer: Pointer;
  BytesRead, BytesWritten: DWORD;
  VirtBufferSize: DWORD;
  NumBufs: DWORD;
  Loop: Integer;
  b: Boolean;
begin
  SrcDrive := '\\.\' + DRIVE;
  hDrive := CreateFile(@SrcDrive[1], GENERIC_READ or GENERIC_WRITE,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if hDrive <> INVALID_HANDLE_VALUE then
  begin
    if LockVolume(hDrive) then
    begin
      if GetDiskGeometry(hDrive, Geometry) then
      begin
        hFile := CreateFile(@Filename[1], GENERIC_READ or GENERIC_WRITE, 0, nil,
          CREATE_ALWAYS, 0, 0);
        if hFile <> INVALID_HANDLE_VALUE then
        begin
          NumBufs := Geometry.Cylinders.LowPart;
          VirtBufferSize := Geometry.TracksPerCylinder * Geometry.SectorsPerTrack
            * Geometry.BytesPerSector;
          IOBuffer := VirtualAlloc(nil, VirtBufferSize, MEM_COMMIT,
            PAGE_READWRITE);
          if Assigned(IOBuffer) then
          begin
            SendMessage(hApp, DIM_START, 0, NumBufs);
            for Loop := NumBufs downto 0 do
            begin
              b := Windows.ReadFile(hDrive, IOBuffer, VirtBufferSize, BytesRead, nil);
              if b and (BytesRead > 0) then
              begin
                b := Windows.WriteFile(hFile, IOBuffer, BytesRead, BytesWritten,
                  nil);
                if (not b) and (BytesRead <> BytesWritten) then
                  break;
                SendMessage(hApp, DIM_PROGRESS, 0, NumBufs-Loop);
              end;
            end; // for
            VirtualFree(IOBuffer, sizeof(VirtBufferSize), MEM_RELEASE);
          end; // Assigned
          CloseHandle(hFile);
        end; // hFile
      end;
    end;
  end;
  DismountVolume(hDrive);
  UnlockVolume(hDrive);
  if hDrive <> INVALID_HANDLE_VALUE then
    CloseHandle(hDrive);
  result := GetLastError();
end;
Sie läuft wunderbar durch, nur am Ende bekomme ich eine Access Violation. Setze ich den Cursor auf die letzte Zeile und starte mit F4, läuft er bis dahin, drücke ich dann F7 bekomme ich die Access Vialotion. Aufgerufen wird die Funktion aus einem Thread raus:
Delphi-Quellcode:
function MakeImgThread(p: Pointer): Integer;
var
  Filename: string;
  ECode: Integer;
begin
  Filename := PTThreadParams(p)^.FFilename;
  EnableWindow(GetDlgItem(hTabDlgs[0], IDC_BTNSAVEAS), False);
  EnableWindow(GetDlgItem(hTabDlgs[0], IDC_BTNMAKEIMG), False);
  ECode := Writefile(Filename);
  if ECode <> 0 then
    MessageBox(hApp, @SysErrorMessage(ECode)[1], 'Fehler beim Erstellen des Images', MB_ICONSTOP);
  EnableWindow(GetDlgItem(hTabDlgs[0], IDC_BTNSAVEAS), True);
  EnableWindow(GetDlgItem(hTabDlgs[0], IDC_BTNMAKEIMG), True);
  SendDlgItemMessage(hStatus, IDC_PROGRESS, PBM_SETPOS, 0, 0);
  result := 0;
  FreeMem(p);
end;
Aber das scheint es nicht zu sein. Ich bekomme sie auch, wenn ich es ohne Thread mache. Auskommentieren der letzten zeilen bring auch nichts.

Was verursacht also die AV um Himmels Willen? http://www.luckie-online.de/pics/mecker.gif
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat