2008. december 15., hétfő
How to get the virtual series number of an audio CD
Problem/Question/Abstract:
How to get the virtual series number of an audio CD
Answer:
Answer 1:
Windows creates a "Virtual Series Number" for Audio CDs. You can use the following code to get the VSN of an audio CD:
type
TNumbBase = 1..36;
function NumbToStr(Numb: LongInt; Base: TNumbBase): string;
const
NumbDigits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
begin
Result := EmptyStr;
while Numb > 0 do
begin
Result := NumbDigits[(Numb mod Base) + 1] + Result;
Numb := Numb div Base;
end;
if Result = EmptyStr then
Result := '0';
end;
function GetCDID(Drive: string): string;
var
Serial: DWord;
T: Cardinal;
begin
if GetVolumeInformation(PChar(Drive), nil, 0, @Serial, T, T, nil, 0) then
Result := NumbToStr(Serial, 16)
else
Result := EmptyStr;
end;
Drive should be the name of the root directory of your CD drive. Use it like
ShowMessage(GetCDID('I:\'));
or
ShowMessage(GetCDID('\\Computer2\\CDDrive\'));
Solve 2:
You have to use the API-call GetVolumeInformation. But first, you have to implement it correctly:
function GetVolumeInformation(lpRootPathName: PAnsiChar; lpVolumeNameBuffer: PAnsiChar; nVolumeNameSize: DWORD; var lpVolumeSerialNumber, lpMaximumComponentLength,
lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: PAnsiChar; nFileSystemNameSize: DWORD): bool; stdcall; external kernel32 name 'GetVolumeInformationA';
In your application:
function GetCDId: string;
var
root: string;
VolumeNameBuffer, FileSystemNameBuffer: PChar;
VolumeSerialNumber, FileSystemFlags, MaximumComponentLength: LongInt;
function Int2Hex(number: LongInt): string;
var
i: LongInt;
s: string;
begin
s := '';
i := 0;
while number > 0 do
begin
i := number mod 16;
case i of
0..9: s := IntToStr(i) + s;
10: s := 'A' + s;
11: s := 'B' + s;
12: s := 'C' + s;
13: s := 'D' + s;
14: s := 'E' + s;
15: s := 'F' + s;
end;
number := number - i * 16;
end;
Result := s;
end;
begin
root := 'x:\'; {where X is the drive letter of your CD drive}
VolumeNameBuffer := StrAlloc(256);
FileSystemNameBuffer := StrAlloc(256);
if GetVolumeInformation(PChar(root), VolumeNameBuffer, 255, VolumeSerialNumber,
MaximumComponentLength, FileSystemFlags, FileSystemNameBuffer, 255) then
Result := Int2Hex(VolumeSerialNumber);
else
Result := '';
end;
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése