Toon posts:

[DELPHI] Benaderen van "removable" media

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ter beveiliging van onze software maken wij gebruik van een 'dongle', hetgeen in feite niks meer is dan een memory stick.

Het bepalen of de 'beveiligings-dongle' is gekoppeld aan het systeem, wordt op de volgende manier gedaan:

Delphi:
1
GetDriveType( 'i:\') ) = DRIVE_REMOVABLE


Aangezien een memory stick verschillende drive letters toegewezen kan krijgen, ga ik voor elk letter in het alfabet de bovenstaande instructie uitvoeren.

Wanneer een memory stick gedetecteerd is, wordt met behulp van de volgende instructie bepaald of dit ook de 'beveiligings-dongle' is (er moet een bestand aanwezig zijn met de naam 'bestandsnaam'):

Delphi:
1
FileExists( 'i:\bestandsnaam' )


Helaas, het komt voor dat er meerdere USB poorten op een systeem aanwezig zijn (bijv. er is een USB HUB aan het systeem gekoppeld). Het geval wil nu dat Windows een (naar mijn mening) niet af te vangen fout genereerd wanneer men een 'removable drive' gaat benaderen (oftewel, een floppydrive of de USB poorten op de USB hub) waar GEEN media in zit. De welbekende 'there is no media inserted. retry, ignore, cancel' of iets van die strekking.

Weet iemand een manier waarmee toch iedere 'removable drive' gecontroleerd kan worden, maar deze drive overslaat wanneer deze geen media bevat?

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Je kunt de vrije diskruimte opvragen van zo'n drive. Wanneer er geen media aanwezig is krijg je een error die je met een try..except af kunt vangen.

Ik heb even oude code opgezocht:
code:
1
2
3
4
5
6
7
8
GetDriveSpace(Drive,Size,Free);
if GetLastError<>0 then begin
   Soort:=GetDriveType(PChar(Drive+':\'));
   if (Soort=DRIVE_REMOVABLE) or (Soort=DRIVE_CDROM) then OutText:=sNoDisk else OutText:=sError;
end else begin
   OutText:=Drive+':'+' '+DKSize(Free)+'/';
   OutText:=OutText+DKSize(Size);
end;


Je moet dus niet met try..except aan de gang maar met GetLastError

[ Voor 83% gewijzigd door Varienaja op 08-06-2005 09:51 ]

Siditamentis astuentis pactum.


  • Icelus
  • Registratie: Januari 2004
  • Niet online
Misschien dat je iets met de GetLogicalDrives API kunt? Deze functie geeft een bitpatroon terug waarbij iedere bit voor een schijfletter staat.
The GetLogicalDrives function returns a bitmask representing the currently available disk drives.

DWORD GetLogicalDrives(VOID)

Parameters
This function has no parameters.

Return Values
If the function succeeds, the return value is a bitmask representing the currently available disk drives. Bit position 0 (the least-significant bit) is drive A, bit position 1 is drive B, bit position 2 is drive C, and so on.
If the function fails, the return value is zero.

Developer Accused Of Unreadable Code Refuses To Comment


Verwijderd

Topicstarter
Dank voor de hulp. Helaas, deze fout blijft ten alle tijden getoond worden door Windows. Probeer maar eens een floppy drive zonder floppy te benaderen. Het is namelijk precies deze foutmelding.

Normaliter, als je een foutmelding van Windows niet wegklikt, kun je een applicatie 'over de foutmelding heen zetten'. Deze foutmeling, echter, blijft 'always on top'.

Helaas worden compiler directivers als {$I-}, TRY ... EXCEPT ... END constructies en GetLatestError functies simpelweg genegeerd en 'overruled' door Windows.

Verwijderd

Topicstarter
Wonder boven wonder. Ik heb de oplossing gevonden in een bericht uit de tijd van vroeger (1997). Mocht men ooit een I/O error willen afvangen:

Delphi:
1
SetErrorMode(SEM_FAILCRITICALERRORS);
SEM_FAILCRITICALERRORS: If this flag is set, the operating system does not display the critical-error-handler message box when such an error occurs. Instead, the operating system sends the error to the calling process.