Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
Floppy Image schreiben endet mit einer Access Violation
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.
|