[Delphi] Event als cf-card in reader wordt gestopt

Pagina: 1
Acties:

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Ik moet software schrijven die een serie compact flash-kaartjes vult. Momenteel test ik met 1 usb-hub en 4 readers. De kaartjes worden voorzien van een unieke id (in een text-filetje of in het label).
Het systeem moet zo gaan werken dat de gebruiker slechts met 1 muiskik hoeft te bevestigen of het ingevoerde kaartje met de bijbehorende data gevuld moet worden.

Nu ben ik op zoek naar 1) een slimme manier om te controleren welke usb-devices er present zijn en 2) een event als er een kaartje in een reader heb gestopt.
Ik heb veel gezocht maar met nog weinig resultaat tot nu toe.

Ik ben zover dat ik kan controleren wanneer een nieuw usb-apparaat wordt aagesloten en wanneer er een wordt verwijderd. Dit doe ik door de WM_DEVICECHANGE message af te vangen maar helaas komt deze niet omhoog wanneer ik een kaartje in een van de readers stop.

Any suggestions?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
first off, ik ben geen Delphi programmeur en ik heb ook vrij weinig binding met windows messages, maar ik ben wel ff voor je aan het googlen geweest. Tijdens mijn speurtocht kwam ik onder andere de WM_USER_SHNOTIFY message tegen die gek genoeg alleen maar hits voor FoxPro opleverde, maar de voorbeelden die ik ermee zag leken wel te doen wat jij wil. Je kunt er allicht naar kijken.

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Heb ook ff gegoogled en is idd alleen foxpro info te vinden over WM_USER_SHNOTIFY. Deze is ook niet gedefinieerd in de 'Messages' unit van delphi. Ik gebruik overigens delphi 7.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Maar je kunt hem zelf eventueel definieren, volgens de website http://blogs.msdn.com/calvin_hsia/archive/2004/11/16/258422.aspx
kun je hem definieren als:
code:
1
2
#define WM_USER                         0x0400
#define WM_USER_SHNOTIFY            WM_USER+10


ff omzetten naar Delphi natuurlijk. Welk OS programmeer je trouwens voor? Want ik vermoed dat dit WinXP en later is.

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Ik heb WM_USER_SHNOTIFY als constante gedefinieerd in mijn component. WM_USER was al gedefinieerd in 'Messages.pas'.

code:
1
2
{$EXTERNALSYM WM_USER_SHNOTIFY}
WM_USER_SHNOTIFY    = WM_USER + 10;


Ik geef even een message als hij deze binnenkrijgt om te kijken of het werkt.
Helaas gebeurd er nog niks als ik een kaartje in de reader stop.

Het is idd de bedoeling dat deze software onder xp komt te draaien.

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Ik ben eens even alle Messages gaan afvangen om er achter te proberen te komen:

code:
1
2
3
4
5
procedure TComponentUSB.WndProc(var Msg: TMessage);
begin
  Append(fLogFile);
  Writeln(fLogFile, DateTimeToStr(Now) + ' - ' + Format('%x', [Msg.Msg]));
end;


Vreemd genoeg komt er echter geen enkele regel in de logfile op de tijden dat ik de kaart erin of eruit haal. Alleen bij het starten en afsluiten krijg ik een paar messages.
Nu lijkt mij dat dit toch wel op een of andere manier af te vangen moet zijn? De service ShellHardwareDetection (ik neem aan dat die WM_USER_SHNOTIFY hier ook vandaan zou moeten komen) draait gewoon op de achtergrond en aangezien windows zelf ook snapt wanneer er een kaartje ingestopt wordt..

  • Icelus
  • Registratie: Januari 2004
  • Niet online

Developer Accused Of Unreadable Code Refuses To Comment


  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
noop, dit is zo ongeveer de code die ik al heb.
hiermee controleer ik wanneer er nieuwe devices worden ingeplugd, dus alleen als je de reader zelf in de usb-poort plugd (of er weer uithaald) maar niet als je een kaartje in de reader stopt.

Verwijderd

Ondersteunt zo'n cardreader geen autoplay? Zo ja, zou je die misschien af kunnen vangen?
USB drives ondersteunen dit geloof ik wel.

[ Voor 4% gewijzigd door Verwijderd op 01-11-2005 16:22 ]


  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Zeker ondersteund zo'n ding autoplay. Je kunt instellen wat hij moet doen bij verschillende soorten data (bijv. afbeeldingen, video, gemengd) maar dan zou ik evengoed een message moeten krijgen van windows toch?
Zoals bigbeng hiervoor al zei is 'WM_USER_SHNOTIFY' hier een goede kandidaat voor, alleen krijg ik deze helaas niet.
Die autoplay wordt volgens mij overigens ook afgehandeld door de ShellHardwareDetection service (svchost.exe -k netsvcs) die op de achtergrond standaard draait.

  • RefleXion
  • Registratie: Februari 2004
  • Laatst online: 20-04 22:16
Misschien is het anders een idee om in plaats van een TXT file voor de identificatie een INF (autorun) file te gebruiken die het programma start met een parameter? Ik programmeer zelf ook in Delphi, een andere oplossing zou kunnen zijn om een keer per 10 sec te controleren welke schijven er allemaal aanwezig zijn, al kost dit natuurlijk meer resources.

58x PV Enphase IQ8+, 16x PV SolarEdge, 2x PV los, 9x Marstek Venus E V3, Peugeot e-208


Verwijderd

Ah, ik kende die message niet.

Misschien heb je hier wat aan. Ik heb er zelf nooit echt serieus naar gekeken:

http://msdn.microsoft.com.../iquerycancelautoplay.asp

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
RefleXion schreef op dinsdag 01 november 2005 @ 16:38:
Misschien is het anders een idee om in plaats van een TXT file voor de identificatie een INF (autorun) file te gebruiken die het programma start met een parameter? Ik programmeer zelf ook in Delphi, een andere oplossing zou kunnen zijn om een keer per 10 sec te controleren welke schijven er allemaal aanwezig zijn, al kost dit natuurlijk meer resources.
Een inf file kom ik niet veel verder mee omdat ik tijdens het runnen van het programma meerdere readers heb waar een kaart ingestopt kan worden. Dan zou ik een erg ranzige constructie moeten bouwen met een programmaatje wat opstart, zich meld bij de eigenlijke software en zich vervolgens weer afsluit.. Om de 10 seconden wil ik ook nog even niet aan gaan beginnen juist om die resources te sparen.

Die IQueryCancelAutoplay ga ik nu eens mee stoeien of ik dat in delphi geimplementeerd krijg.

  • RefleXion
  • Registratie: Februari 2004
  • Laatst online: 20-04 22:16
Hardcell schreef op woensdag 02 november 2005 @ 09:42:

Een inf file kom ik niet veel verder mee ...geimplementeerd krijg.
Dat is ook niet helemaal wat ik bedoelde. Meer dat het kaartje door de INF file het programma opstart, en dat DAT programma dan het kaartje volschrijft. Dan zou het dus ook niet uitmaken welk kaartje je in welke reader stopt omdat hij hem dan nog met de juiste gegevens volschrijft. Maar het lijkt er dus op dat je een programma wilt hebben dat continu draait.

Microsoft heeft hier zelf ook een artikel over: http://support.microsoft....aspx?scid=kb;en-us;163503 , helaas gaat dit alleen over CD- en DVD-rom drives. Maar wie weet werkt het ook met CF-kaartjes.

Het detecteren van USB apparaten is niet zo moeilijk:
http://www.swissdelphicenter.ch/torry/showcode.php?id=2211
Ik betwijfel alleen of je er iets aan hebt, want ik neem aan dat je niet de hele
reader ontkoppelt.

[ Voor 28% gewijzigd door RefleXion op 02-11-2005 10:53 ]

58x PV Enphase IQ8+, 16x PV SolarEdge, 2x PV los, 9x Marstek Venus E V3, Peugeot e-208


  • El_kingo
  • Registratie: Mei 2002
  • Laatst online: 17-03-2025
Ik zelf gebruik dit component om events af te vangen, deze kan ook events afvangen als media wordt ge-insert of ge-removed.

http://www.delphi.com.ar/vcl/ShellNotify.zip

(zie ook evt. torry.net: http://www.torry.net/pages.php?id=515 en dan ShellNotify v.1)

Volgens mij moet het hiermee kunnen.

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
sparcky schreef op woensdag 02 november 2005 @ 13:18:
Ik zelf gebruik dit component om events af te vangen, deze kan ook events afvangen als media wordt ge-insert of ge-removed.

http://www.delphi.com.ar/vcl/ShellNotify.zip

(zie ook evt. torry.net: http://www.torry.net/pages.php?id=515 en dan ShellNotify v.1)

Volgens mij moet het hiermee kunnen.
Dit lijkt iig erg veelbelovend, alleen begint delphi te miepen voor het bestand VASBase.pas wat hij niet kan vinden. Googelen hierop geeft 0 resultaten.
Waar heb jij dit bestand gevonden?

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Ben er al uit.
Ik moest eerst het pcsc component installeren.
Het component ziet idd wanneer media in een reader wordt gestopt of eruit wordt gehaald! Ik ga er meteen mee aan de slag.

Bedankt voor alle hulp!

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Om er toch nog even op terug te komen... (heb het even laten liggen wegens andere prioriteiten)

Ik krijg met dit component nu wel een event bij het inserten of removen van media alleen niet de juiste.
Ik krijg bij het inserten EN bij het removen 2x het directory-renamed event (SHCNE_RENAMEFOLDER). Ik heb toen natuurlijk geprobeerd wat hij voor event gaf bij het daadwerkelijk renamen van een folder maar helaas, dezelfde..

Ligt dit aan windows? Ps: bij die shellnotify zit een .exe demo mochten mensen zich geroepen voelen om dit thuis ff te testen. :P

  • El_kingo
  • Registratie: Mei 2002
  • Laatst online: 17-03-2025
Helaas heb (of gebruik) ik zelf geen flash card reader, dus ik kan dit niet voor je testen, ik heb in de source code gekeken en als het goed is moet hij gewoon een SHCNE_MEDIAINSERTED of een SHCNE_MEDIAREMOVED event geven.
Er staan wel verwijzingen naar msdn artikelen in de source code, misschien dat je daarmee nog verder kunt komen...
En anders misschien een mailtje naar de programmeur?

  • Hardcell
  • Registratie: November 2004
  • Laatst online: 03-02-2023
Ik zal het eens proberen met een mailtje naar de programmeur al komt t volgens mij ergens uit argentinië dus ben benieuwd of dit wat gaat opleveren..

no offence to all the argentijnse leden van dit forum :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
bigbeng schreef op dinsdag 01 november 2005 @ 11:06:
first off, ik ben geen Delphi programmeur en ik heb ook vrij weinig binding met windows messages, maar ik ben wel ff voor je aan het googlen geweest. Tijdens mijn speurtocht kwam ik onder andere de WM_USER_SHNOTIFY message tegen die gek genoeg alleen maar hits voor FoxPro opleverde, maar de voorbeelden die ik ermee zag leken wel te doen wat jij wil. Je kunt er allicht naar kijken.
WM_USER_SHNOTIFY bestaat niet (echt). De truc is RegisterShellNotification. Die geef je een eigen message mee (bijvoorbeeld WM_USER+10). Bij een ShellNotification wordt die message dan teruggestuurd.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1