21. december 2004 - 18:22Der er
41 kommentarer og 1 løsning
Program opdager at der er en stick i USB porten og åbner "drevet"
Hej allesammen, lige et lille spm inden jul... Jeg sidder og leger med et lille program som har et billede i hjørnet som viser 1.jpg når der ikke er en "memory stick" tilsluttet USB porten og 2.jpg når der er tilsluttet en "memory stick" til USB porten...
Når der er tilsluttet en "memory stick" til USB porten, kan man trykke på billedet og der kommer et "panel" frem som viser alle filerne på USB drevet... (Det er ikke et Tpanel, men den som viser filerne i en gælden mappe i et slags panel..(sidder ikke lige ved en pc der har delphi))
Er der desuden nogen der kender et stykke kodet der laver en popup i "panelet" som gør at når man trykker på een af filerne så kommer popuppet op og viser: "Kopier til C:/" Kopier til "D:/Dokumenter/"??
Håber der er nogen der har prøver det før, da det er ved at drive mig til vanvid... :)
Har forresten været inde på et andet spm på eksperten: http://eksperten.dk/spm/400853 men syntes ikke at hjælpe meget...
heh jo... :) har bidt mærke i det.... Men koden gider ikke lige værke lige nu siger Decleration incorrect... men har ikke sovet for meget i nat så checker det lige lidt senere... :)
Men stoney/tolderlund, hvordan konverterer man den sådan at den viser et billede når den er online og et andet når den er offline...
Og kan man gøre det sådan at den åbner "drevet" sådan at man ser filerne, og at der så kommer en menu op når man trykker på filerne, altså en popup?
Nu har jeg faktisk prøvet et par gange, og den viser stadig det med Decleration incorrect.... der er vel ikke een af jer der vil sende den fulde source til mig på, pubstar@slyngelstuen.dk ?
forresten i kunne vel ikke sige mig om følgende er muligt: Men stoney/tolderlund, hvordan konverterer man den sådan at den viser et billede når den er online og et andet når den er offline...
Og kan man gøre det sådan at den åbner "drevet" sådan at man ser filerne, og at der så kommer en menu op når man trykker på filerne, altså en popup?
ahhh.... :) findes der nogle fingerregler for hvordan man kan se at det er en komponent??? eller er det bare noget man kan se når den ikke vil virke?:)
og findes der en måde hvorpå man kan se om det er en memory stick i USB porten, altså om der er "lavet" et nyt drev til USB stikket eller lignende?? og at man så kan gå ind på den?
Man kan ikke se om det er en USB stick eller en harddisk. Prøv selv at se i stifinder, windows opfatter det som en harddisk.
Omkring drev kan du lave en "liste" over dine drev og når der sker en ændring lave en ny liste og sammenligne og derved se hvad der er tilføjet/slettet af drev og evt. starte stifinder på dette drev fra dit program.
Okay, men er det ikke muligt at programmet bare går ud fra at det er en memory stick, og så siger at den skal åbne (devType=DBT_DEVTYP_DEVICEINTERFACE) eller lign?
Du ved vel ikke hvordan man går sådan at den på Form create checker om der er en enhed i USB porten eller ej?
KFZ> jeg kunne da også sende det til dig... :) men hvad er det du vil lave, måske kunne vi hjælpe hinanden.... for jeg er ikke kommet meget længere siden dette indlæg...?? Du ved vel ikke hvad der skal til for at man kan gå ind på et USB stick vha et ListView i ens applikation??
prodoc>>tager lige en ting af gangen. 1. tak fordi du gider sende den. 2. mit problem er at jeg ikke kan gennemskue hvordan man bruger komponenten og får fat i den message den sender. 3. skal bruge det til et sikkerheds program hvor der skal ligge en fil på en usb-flashdisk, og meningen er at den selv skal kunne se hvis den bliver sat til, i tilfælde af at disken ikke var sat i når man starter computeren, og brugeren ikke har adgang til noget andet end mit program. 4. mht. dit problem så tror jeg jeg skal bruge noget i den stil, ellers kan jeg da lige prøve at finde ud af noget.
Jo mange tak, jeg sidder ikke lige hos min privat computer lige nu men kommer hjem i aften, så sender den der... Men ville da meget gerne se dit projekt når det var færdigt.. :) ( pubstar@slyngelstuen.dk ), men igen sender det lige i aften
kfz> Hvordan går det med programmet? Jeg kunne vel ikke få dit til at svare hvad enten du har fundet en løsning eller ej.. :) Så jeg ikke sætter mine forhåbninger for højt op...? :)
jeg har løsningen liggende, men kan bare ikke lige finde den, og har lige været på skiferie osv. men prøver at finde det i løbet af ugen og så lover jeg at du hører fra mig....
Hej Kfz, mit internet har været nede et par dage, men jeg har ikke modtaget noget på mailen? jeg kunne vel ikke få dig til at sende det igen? ( pubstar@slyngelstuen.dk )
Du får lige dine points nu.. men håber det er i orden hvis jeg stiller dig nogle spm senere, skal lige have mit USB stick tilbage fra en bekendt... Før kunne jeg bare checke om det virkede ved at hive min mus ud og så sætte den ind igen (USB mus) :) Koden kommer lige her:
type PDevBroadcastHdr = ^TDevBroadcastHdr; TDevBroadcastHdr = packed record dbcd_size: DWORD; dbcd_devicetype: DWORD; dbcd_reserved: DWORD; end;
type PDevBroadcastVolume = ^TDevBroadcastVolume; TDevBroadcastVolume = packed record dbcv_size: DWORD; dbcv_devicetype: DWORD; dbcv_reserved: DWORD; dbcv_unitmask: DWORD; dbcv_flags: Word; end;
var Form1: TForm1;
implementation
{$R *.dfm}
function GetDrive(pDBVol: PDevBroadcastVolume): string; var i: Byte; Maske: DWORD; begin Maske := pDBVol^.dbcv_unitmask; for i := 0 to 25 do begin if (Maske and 1) = 1 then Result := Char(i + Ord('A')) + ':'; Maske := Maske shr 1; end; end;
procedure TForm1.WMDeviceChange(var Msg: TMessage); var Drive: string; begin case Msg.wParam of DBT_DeviceArrival: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_volume then begin Drive := GetDrive(PDevBroadcastVolume(Msg.lParam)); label1.Caption := 'USB device inserted in Drive ' + Drive; end; DBT_DeviceRemoveComplete: if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_volume then begin Drive := GetDrive(PDevBroadcastVolume(Msg.lParam)); label1.Caption := 'USB device removed from Drive ' + Drive; end; end; end;
type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var typ: Integer; s: string; begin s := edit1.Text + ':\'; typ := GetDriveType(PChar(s)); if Typ <> 0 then case typ of DRIVE_REMOVABLE: begin ShowMessage('Drive Removable'); end; DRIVE_FIXED: begin ShowMessage('Harddisk'); end; DRIVE_CDROM: begin ShowMessage('CD ROM Drive'); end; DRIVE_RAMDISK: begin ShowMessage('RAM Drive'); end; DRIVE_REMOTE: begin ShowMessage('Remote Drive'); end; end; end;
det er fordi du selv skal vælge drevet som den er sat i, det får du af det første program, de kan relativt nemt sættes sammen, men det har jeg ikke haft behov for, så derfor er det bare 2 eksempler, og stil endelig flere spørgsmål hvis du har nogle.
Det er self. nemt at sige bagefter men nåå ja, kan jeg faktisk godt se nu... :) Men jeg har endnu et lille spørgsmål... findes der ikke en DBT sætning hvor den ser om "DBT_DEVICEINSERTED" sådan at den checker om der allerede er en USB stick i?
Jeg tænkte først på bare at gøre det sådan at den skriver til en memo eller lign, at når den er inserted så skriver den 1 og når den bliver hevet ud så skriver den 0. Men så kom jeg i tanke om at hvis USB stick'et bliver hevet ud når computeren er slukket så kan den jo ikke ændre i værdierne (1 eller 0) og så når man starter den igen så ville den sikkert tro at USB stick'et stadig ville være sat i...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.