[Delphi] Hoe wisseling van cd/diskette te detecteren?

Pagina: 1
Acties:

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22:35
Ik probeer al een tijdje uit te vinden hoe ik kan detecteren of een cd/diskette is gewisseld. Voorlopig doe ik het door regelmatig te controleren of dezelfde schijf erin zit, maar er moet een mooiere manier zijn.

Zoeken levert alleen maar info, over het testen van de aanwezigheid van een schijf. Terwijl ik op zoek ben naar een event, die wordt aangeroepen, zodra er een cd/diskette er in wordt gedaan.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Voor diskettes wordt het denk ik moeilijk, aangezien Windows (2000) zelf ook steeds kijkt of er een diskette aanwezig is zodra je je diskette drive aanklikt in de verkenner en er geen diskette in zit.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
Heb geen ervaring/kennis met Delphi, maar kan je niet iets met die info dat je zelf een event genereert ?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Voor CD's kan ik me nog wel voorstellen dat er een event is, voor een diskette is deze er niet. Als je wilt weten op een bepaald moment of dezelfde disk of cd er nog in zit, kan je het ID checken (elke disk en CD heeft een uniek ID wat gewoon is op te vragen (volume id)).

Als je echt een event wil hebben wanneer er een disk of cd is verwisselt.. tja.. voor disks is dat zeer waarschijnlijk niet te vinden, en voor de cd's zijn misschien wat api's beschikbaar?

Er zijn call's om een directory te monitoren. Deze roepen weer een callback functie aan op het moment dat de (inhoud van) een directory is verandert. Misschien dat je daar iets mee kan? Ik ken deze call's niet uit m'n hoofd dus je zult ff moeten zoeken op MSDN o.i.d. ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Zeker voor floppy drives is er niet echt een andere manier dan gewoon proberen.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function DiskInDrive(Drive: Char): Boolean;
// Disk could be a floppy, CD-ROM,...
var
  ErrorMode: word;
begin
  { make it upper case }
  if Drive in ['a'..'z'] then Dec(Drive, $20);
  { make sure it's a letter }
  if not (Drive in ['A'..'Z']) then
    raise EConvertError.Create('Not a valid drive ID');
  { turn off critical errors }
  ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
  try
    { drive 1 = a, 2 = b, 3 = c, etc. }
    if DiskSize(Ord(Drive) - $40) = -1 then
      Result := False
    else
      Result := True;
  finally
    { restore old error mode }
    SetErrorMode(ErrorMode);
  end;
end;

of

type
   TDriveState=( DS_NO_DISK, DS_UNFORMATTED_DISK, DS_EMPTY_DISK,
                DS_DISK_WITH_FILES );

 Function DriveState( driveletter: Char ): TDriveState;
 Var
   mask: String[6];
   sRec: TSearchRec;
   oldMode: Cardinal;
   retcode: Integer;
 Begin
   oldMode:= SetErrorMode( SEM_FAILCRITICALERRORS );
   mask:= '?:\*.*';
   mask[1] := driveletter;
   retcode := FindFirst( mask, faAnyfile, SRec );
   If retcode = 0 Then FindClose( SRec );
   { ShowMessage(Format('FindFirst returned %d', [retcode])); }
   Case Abs(retcode) Of
      0: Result := DS_DISK_WITH_FILES; { found at least one file }
     18, 2: Result := DS_EMPTY_DISK; { found no files but otherwise ok }
     21, 3: Result := DS_NO_DISK; { DOS ERROR_NOT_READY on WinNT,}
                                   { ERROR_PATH_NOT_FOUND on Win 3.1 }
   Else
     Result := DS_UNFORMATTED_DISK;
   End;
   SetErrorMode( oldMode );
 End; { DriveState }


Je kan via de message WM_DEVICECHANGE te horen krijgen of er een CD in of uit gehaald wordt. Zoek google voor een component genaamd TCDEvents voor een kant en klare versie.

We adore chaos because we like to restore order - M.C. Escher