@Alle
Zum obigen Code: Funktioniert nicht!
Ich habe mit der Zeile
Zitat:
Device := Format('\\.\%s:', ['D']);
mein CD Laufwerk angesprochen. Prima: Meldet schreibgeschützt. Aber meine beschreibare Festplatte leider auch.
Delphi-Quellcode:
function IDW(Drive: Integer): Boolean;
const
IOCTL_DISK_IS_WRITABLE = (
($00000007 shl 16) or (0 shl 14) or
($0009 shl 2) or 0);
var
Device: String;
hFile: THandle;
BytesReturned: Cardinal;
begin
Result := false;
//Device := Format('\\.\%s:', [Char(Drive + 65)]); //Original!
Device := Format('\\.\%s:', ['D']); //Zum Testen von Laufwerk D etc.
hFile := CreateFile(@Device[1], GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hFile <> 0 then
begin
Result := DeviceIoControl(hFile, IOCTL_DISK_IS_WRITABLE, nil, 0, nil, 0,
BytesReturned, nil);
CloseHandle(hFile);
end;
end;
Mit dem nachfolgendem Beispiel funktioniert es zumindestens auf CD ROMS und Festplatten: Aber auf eine Diskette, die schreibgeschützt ist, kommt eine dicke Fehlermeldung, wie immer, wenn auf Laufwerk A: geschreiben werden soll.
Delphi-Quellcode:
function IsDriveWritable(Drive: Integer): Boolean;
const
IOCTL_DISK_IS_WRITABLE = (
($00000007 shl 16) or (0 shl 14) or
($0009 shl 2) or 0);
var
Device: String;
hFile: THandle;
BytesReturned: Cardinal;
begin
Result := false;
Device := Format('\\.\%s:', [Char(Drive + 65)]);
hFile := CreateFile(@Device[1], GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hFile <> 0 then
begin
Result := DeviceIoControl(hFile, IOCTL_DISK_IS_WRITABLE, nil, 0, nil, 0,
BytesReturned, nil);
CloseHandle(hFile);
end;
end;
Vorerst habe ich es mit IsDriveWritable gelöst. Besser ist es natürlich zu wissen, was für einen Datenträger man hat:
ListDrives Torry und dann IsDriveWritable aufruft.
Wer hat was zusammengestoppselt, was funktioniert?
Beste Grüße Go2EITS