Ich habe mir das Projekt im letzten Beitrag noch mal vorgenommen. Es werden nur noch die bass.dll und basscd.dll benötigt. Die Unit1 sieht dann wie folgt aus:
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, SysUtils, Forms, Classes, Controls, StdCtrls;
type
TForm1 =
class(TForm)
cmbDrives: TComboBox;
procedure FormCreate(Sender: TObject);
procedure cmbDrivesChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
MAXDRIVES = 10;
basscddll = '
basscd.dll';
function BASS_CD_GetDriveDescription(drive:DWORD): PChar;
stdcall;
external basscddll;
function BASS_CD_GetDriveLetter(drive:DWORD): DWORD;
stdcall;
external basscddll;
var
Form1: TForm1;
curdrive: Integer = 0;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
n: PChar;
a: Integer;
lw,
text:
String;
begin
// Get list of available drives
a := 0;
n := BASS_CD_GetDriveDescription(a);
while (a < MAXDRIVES)
and (n <>
nil)
do
begin
lw := n;
lw := copy(lw, 0, pos('
v', lw) - 1);
text := Format('
%s: %s', [Char(BASS_CD_GetDriveLetter(a)
+ Ord('
A')), lw]);
// "letter: description"
cmbDrives.Items.Add(text);
a := a + 1;
n := BASS_CD_GetDriveDescription(a);
end;
if (a = 0)
then
begin
MessageBox(0, '
No CD drives found', '
Error', MB_ICONERROR);
Halt;
end;
cmbDrives.ItemIndex := 0;
// select 1st drive
end;
procedure TForm1.cmbDrivesChange(Sender: TObject);
begin
// change current drive
curdrive := cmbDrives.ItemIndex;
end;
end.
Im Anhang das Projekt als Source mit
DLL.
Nachtrag: Ich hoffe, eine Stunde ist nicht so lang, als dass der Nachtrag nicht mehr gelesen wird.
Die virtuellen Laufwerke auf meinen beiden Rechnern werden als 'Generic' erkannt, während die anderen mit Namen (nur Großbuchstaben) angegeben werden. Kann ich im Umkehrschluss davon ausgehen, dass 'Generic' immer virtuelle Laufwerke sind? Denn dann kann ich wenigsten die schon mal ausschließen.