How to get the virtual series number of an audio CD (Views: 707)
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; |