Lucrul cu dispozitivele din ferestrele borland delphi

Obținerea unei liste de dispozitive

Activați sau dezactivați dispozitivele.

Starea dispozitivului este controlată de funcția SetupDiSetClassInstallParams. Descrierea ei:
WINSETUPAPI BOOL WINAPI






SetupDiSetClassInstallParams (
În HDEVINFO DeviceInfoSet,
În PSP_DEVINFO_DATA DeviceInfoData, OPȚIONAL
IN PSP_CLASSINSTALL_HEADER ClassInstallParams, OPȚIONAL
IN DWORD ClassInstallParamsSize
);
Cu primii doi parametri, cred că totul este clar. Al treilea parametru specifică un indicator pentru structura SP_CLASSINSTALL_HEADER. Al patrulea parametru specifică dimensiunea celui de-al treilea parametru. Cu această funcție puteți efectua diferite acțiuni cu dispozitive și, desigur, diferite structuri sunt utilizate pentru fiecare acțiune. Dar pentru fiecare dintre structuri prima componentă este aceeași - structura SP_CLASSINSTALL_HEADER, aici este:
typedef struct _SP_CLASSINSTALL_HEADER DWORD cbSize;
DI_FUNCTION InstallFunction;
> SP_CLASSINSTALL_HEADER, * PSP_CLASSINSTALL_HEADER;
Câmpul InstallFunction specifică operațiunea efectuată pe dispozitiv. Pentru a activa / dezactiva acest câmp va fi egal cu DIF_PROPERTYCHANGE constant. Următoarea structură este utilizată pentru activarea / dezactivarea dispozitivului:
typedef struct _SP_PROPCHANGE_PARAMS SP_CLASSINSTALL_HEADER ClassInstallHeader;
DWORD StateChange;
DWORD Domeniul de aplicare;
DWORD HwProfile;
> SP_PROPCHANGE_PARAMS, * PSP_PROPCHANGE_PARAMS;
În cazul în care câmpul statechange va fi DICS_ENABLE, dispozitivul va fi inclus în alt mod DICS_DISABLE. În cazul în care câmpul Domeniu de aplicare este DICS_FLAG_GLOBAL, modificările vor intra în vigoare pentru toate profilurile de hardware în cazul DICS_FLAG_CONFIGSPECIFIC, modificarea va intra în vigoare pentru profilul hardware-ul specificat. câmp HwProfile specifică ID-ul profilului de hardware, care va fi aplicat pentru a schimba dacă este zero, atunci profilul curent hardware. Toți parametrii trebuie să fie "aprobați" înainte de orice modificare. Prin urmare, funcția trebuie apelată de două ori. Dacă după primul apel la funcția returnează o valoare reală, atunci puteți apela funcția pentru a doua oară.
După modificarea stării dispozitivului, trebuie să apelați instalatorul de clasă. După modificarea stării dispozitivului, poate fi necesar să reporniți sistemul sau alte acțiuni pentru ca modificările să aibă efect. Acest lucru este realizat de SetupDiCallClassInstaller
WINSETUPAPI BOOL WINAPI
SetupDiCallClassInstaller (
IN DI_FUNCTION InstallFunction,
În HDEVINFO DeviceInfoSet,
În PSP_DEVINFO_DATA DeviceInfoData OPTIONAL
);
Primul parametru specifică codul operației efectuate. Ceilalți doi parametri cred că nu vor cauza probleme.
Un exemplu este codul pentru activarea și dezactivarea conexiunii la rețea. Pentru a activa / dezactiva conexiunea la rețea, este suficient să activați / dezactivați dispozitivul de rețea prin care se realizează conexiunea la rețea. Aceasta produce următoarea funcție:






procedura EnableNetDevice (aState: boolean; index: integer);
var
NetPnPHandle: HDEVINFO;
PCHP: TSPPropChangeParams;
DeviceData: TSPDevInfoData;
începe
NetPnPHandle: = SetupDiGetClassDevs (@GUID_DEVCLASS_NET, 0, 0, DIGCF_PRESENT);
dacă NetPnPHandle = INVALID_HANDLE_VALUE ieșiți;
DeviceData.cbSize: = sizeof (TSPDevInfoData);
SetupDiEnumDeviceInfo (NetPnPHandle, index, DeviceData);
PCHP.ClassInstallHeader.cbSize: = sizeof (TSPClassInstallHeader);
dacă SetupDiSetClassInstallParams (NetPnPHandle, @ DeviceData, @ PCHP, sizeof (TSPPropChangeParams)) apoi
începe
PCHP.ClassInstallHeader.cbSize: = dimensiunea (TSPClassInstallHeader);
PCHP.ClassInstallHeader.InstallFunction: = DIF_PROPERTYCHANGE;
PCHP.Scope: = DICS_FLAG_CONFIGSPECIFIC;
dacă este atunci
PCHP.StateChange: = DICS_ENABLE
altfel
PCHP.StateChange: = DICS_DISABLE;
SetupDiSetClassInstallParams (NetPnPHandle, @ DeviceData, @ PCHP, sizeof (TSPPropChangeParams));
SetupDiCallClassInstaller (DIF_PROPERTYCHANGE, NetPnPHandle, @ DeviceData);
se încheie;
DeviceData.cbSize: = sizeof (TSPDevInfoData);
SetupDiDestroyDeviceInfoList (NetPnPHandle);
se încheie;
Parametrul index specifică indexul dispozitivului de rețea din lista dispozitivelor de rețea.

Înlăturați în siguranță dispozitivul

Deci, am pornit / oprit dispozitivele. Și cum pot elimina în siguranță dispozitivul? Funcția CM_Request_Device_Eject efectuează o extragere sigură a dispozitivului. Iată descrierea ei:
CMAPI CONFIGRET WINAPI
CM_Request_Device_Eject (
IN DEVINST dnDevInst,
OUT PPNP_VETO_TYPE pVetoType,
OUT LPTSTR pszVetoName,
IN ULONG ulNameLength,
ÎN ULONG ulFlags
);
Primul parametru este mânerul dispozitivului. Al doilea parametru este un indicator pentru o variabilă care va stoca codul motivului pe eșec. Al treilea parametru este un indicator al liniei în care motivul eșecului va fi memorat când apelul nu reușește. Ambii parametri sunt opționali și pot fi zero. Al cincilea parametru este lungimea maximă a șirului. Cel de-al șaselea nu este folosit. Dacă pszVetoName este zero, atunci sistemul va afișa mesajul dacă nu reușește. Aici este funcția însăși, care realizează o extragere sigură a dispozitivului.
procedura RemoveDrive (index: integer);
var
DrivesPnPHandle: HDEVINFO;
DevInfo: SP_DEVINFO_DATA;
i: Integer;
Părinte: DWORD;
VetoName: matrice [0..MAX_PATH] de char;
începe
DevInfo.cbSize: = dimensiunea (SP_DEVINFO_DATA);
DrivesPnPHandle: = SetupDiGetClassDevsA (@GUID_DEVCLASS_DISKDRIVE, zero, 0, 2);
dacă DrivesPnPHandle = INVALID_HANDLE_VALUE apoi ieșiți;
dacă SetupDiEnumDeviceInfo (DrivesPnPHandle, index, DevInfo) atunci
începe
dacă (IsUSBDevice (DevInfo.DevInst)) și (CM_Get_Parent (Parent, DevInfo.DevInst, 0) = CR_SUCCESS)
atunci
începe
CM_Request_Device_Eject (Parent, Nil, @VetoName, MAX_PATH, 0);
dacă VetoName = '' atunci
ShowMessage ("dispozitivul poate fi eliminat")
altfel
ShowMessage ("dispozitivul nu poate fi eliminat");
capăt
altfel
ShowMessage ("Dispozitivul nu este USB");
se încheie;
SetupDiDestroyDeviceInfoList (DrivesPnPHandle);
se încheie;
Singurul parametru al funcției trecute este indexul dispozitivului de disc din lista dispozitivelor de disc. Singurul lucru care nu poate fi înțeles aici este funcția CM_Get_Parent. Devine părintele dispozitivului. La urma urmei, orice "unitate flash" sau unitate de disc externă este un dispozitiv compozit și este necesar să deconectați dispozitivul părinte. Codul funcției IsUSBDevice este în codul sursă, care este atașat la articol.

SetupAPI nu vă permite să primiți informații (sunet, imagine) de la diverse dispozitive. SetupAPI este conceput pentru a instala și a elimina dispozitivele, pentru a obține caracteristicile dispozitivului etc.

Mulțumesc foarte mult, căutam un astfel de articol timp de două săptămâni, dar nu am găsit nimic chiar aproape. Vă mulțumesc foarte mult!







Articole similare

Trimiteți-le prietenilor: