Munka eszközök Windows Borland Delphi

Első készülékek listája

Engedélyezése és letiltása eszközök.

Állam az eszköz működését ellenőrzi SetupDiSetClassInstallParams. Az ő leírása:
WINSETUPAPI BOOL WinAPI
SetupDiSetClassInstallParams (
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData, VÁLASZTHATÓ
IN PSP_CLASSINSTALL_HEADER ClassInstallParams, VÁLASZTHATÓ
IN DWORD ClassInstallParamsSize
);
Az első két lehetőség, azt hiszem, minden világos. A harmadik paraméter a mutató egy szerkezet SP_CLASSINSTALL_HEADER. A negyedik paraméter megadja a méret a harmadik paraméter. Ezzel a funkcióval különböző műveleteket lehet elvégezni, hogy a készülék, és természetesen minden egyes fellépés különféle szerkezetek. De mind a struktúrák az első komponens ugyanaz - SP_CLASSINSTALL_HEADER szerkezet, itt van:
typedef struct _SP_CLASSINSTALL_HEADER DWORD cbSize;
DI_FUNCTION InstallFunction;
> SP_CLASSINSTALL_HEADER, * PSP_CLASSINSTALL_HEADER;
InstallFunction mező határozza termelt mint a készülék működését. Engedélyezése / tiltása ezen a területen egyenlő állandó DIF_PROPERTYCHANGE. Be- / ki a készüléket alábbi szerkezetet használjuk:
typedef struct _SP_PROPCHANGE_PARAMS SP_CLASSINSTALL_HEADER ClassInstallHeader;
DWORD statechange;
DWORD terjedelme;
DWORD HwProfile;
> SP_PROPCHANGE_PARAMS, * PSP_PROPCHANGE_PARAMS;
Ha statechange mező lesz DICS_ENABLE, a készülék tartalmazza egyébként DICS_DISABLE. Ha a terjedelem mező DICS_FLAG_GLOBAL, a változások lépnek életbe az összes hardver profilt, ha DICS_FLAG_CONFIGSPECIFIC, a változás lép érvénybe a megadott hardver profilt. HwProfile mező határozza meg a profil ID hardver, amelyet alkalmazni kell változtatni, ha ez nulla, akkor az aktuális hardver profilt. Minden lehetőséget igényel „jóváhagyás” mielőtt bármilyen változást. Ezért a funkciót kell hívni kétszer. Ha az első hívást a függvény egy valódi érték, akkor a függvényt egy másik alkalommal.
Megváltoztatása után a készülék állapotát hívjanak osztály telepítőt, megváltoztatása után a készülék állapotát lehet a rendszer újraindítása, vagy más intézkedéseket annak érdekében, hogy alkalmazza a változtatásokat. Ez a funkció végezzük SetupDiCallClassInstaller
WINSETUPAPI BOOL WinAPI
SetupDiCallClassInstaller (
IN DI_FUNCTION InstallFunction,
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData VÁLASZTHATÓ
);
Az első paraméter határozza meg a kódot a termelt működését. Két másik paraméter azt hiszem, nem okoz problémát.
Példaként a kódot, hogy engedélyezze vagy tiltsa le a hálózati kapcsolatot. Annak érdekében, hogy engedélyezni / letiltani a hálózati kapcsolat is elegendő / letiltja a hálózati eszköz, amelyen keresztül a hálózati kapcsolat. Ez a következő függvény:
eljárás EnableNetDevice (aState: logikai; index: integer);
var
NetPnPHandle: HDEVINFO;
PCHP: TSPPropChangeParams;
DeviceData: TSPDevInfoData;
kezdődik
NetPnPHandle: = SetupDiGetClassDevs (@GUID_DEVCLASS_NET, 0, 0, DIGCF_PRESENT);
ha NetPnPHandle = INVALID_HANDLE_VALUE majd kilép;
DeviceData.cbSize: = sizeof (TSPDevInfoData);
SetupDiEnumDeviceInfo (NetPnPHandle, index, DeviceData);
PCHP.ClassInstallHeader.cbSize: = sizeof (TSPClassInstallHeader);
ha SetupDiSetClassInstallParams (NetPnPHandle, @ DeviceData, @ PCHP, sizeof (TSPPropChangeParams)), majd
kezdődik
PCHP.ClassInstallHeader.cbSize: = sizeof (TSPClassInstallHeader);
PCHP.ClassInstallHeader.InstallFunction: = DIF_PROPERTYCHANGE;
PCHP.Scope: = DICS_FLAG_CONFIGSPECIFIC;
ha aState majd
PCHP.StateChange: = DICS_ENABLE
más
PCHP.StateChange: = DICS_DISABLE;
SetupDiSetClassInstallParams (NetPnPHandle, @ DeviceData, @ PCHP, sizeof (TSPPropChangeParams));
SetupDiCallClassInstaller (DIF_PROPERTYCHANGE, NetPnPHandle, @ DeviceData);
végén;
DeviceData.cbSize: = sizeof (TSPDevInfoData);
SetupDiDestroyDeviceInfoList (NetPnPHandle);
végén;
index paraméter határozza meg az index a hálózati eszköz a hálózati eszköz listán.

Biztonságos eltávolítás eszköz

Tehát az on / off készülékek megértjük. Hogyan kell biztonságosan eltávolítani az eszközt? Biztonságos eltávolítása CM_Request_Device_Eject készülék feladatokat hajt végre. Itt van ő leírása:
CMAPI CONFIGRET WinAPI
CM_Request_Device_Eject (
IN DEVINST dnDevInst,
OUT PPNP_VETO_TYPE pVetoType,
OUT LPTSTR pszVetoName,
IN ULONG ulNameLength,
IN ULONG ulFlags
);
Az első paraméter a kilincset a készüléket. A második paraméter egy mutató változó, ami menthető okból kód hiba. A harmadik paraméter egy mutató egy string, amelyben a hiba oka egy sikertelen hívás fenntartható lesz. Mindkét paraméter opcionális és lehet nulla. Az ötödik paraméter a maximális hosszát a húr. Hatodik nem használják. Ha pszVetoName nulla, akkor a hiba üzenet jelenik meg, magát a rendszert. Itt látható a függvény, amely végrehajtja biztonságosan távolítsa el a készüléket.
eljárás RemoveDrive (index: integer);
var
DrivesPnPHandle: HDEVINFO;
DevInfo: SP_DEVINFO_DATA;
i: integer;
Szülő: DWORD;
VetoName: array [0..MAX_PATH] char;
kezdődik
DevInfo.cbSize: = sizeof (SP_DEVINFO_DATA);
DrivesPnPHandle: = SetupDiGetClassDevsA (@GUID_DEVCLASS_DISKDRIVE, nulla, 0, 2);
ha DrivesPnPHandle = INVALID_HANDLE_VALUE majd kilép;
ha SetupDiEnumDeviceInfo (DrivesPnPHandle, index, DevInfo), majd
kezdődik
ha (IsUSBDevice (DevInfo.DevInst)) és (CM_Get_Parent (Parent, DevInfo.DevInst, 0) = CR_SUCCESS)
majd
kezdődik
CM_Request_Device_Eject (Parent, nil, @VetoName, MAX_PATH, 0);
ha VetoName = „”, akkor
ShowMessage ( „eszköz kivonat”)
más
ShowMessage ( „eszközt nem lehet eltávolítani„);
vég
más
ShowMessage ( 'Nincs USB-eszköz');
végén;
SetupDiDestroyDeviceInfoList (DrivesPnPHandle);
végén;
Az egyetlen paraméter lett átadva a funkció az index a lemez eszköz a listában a meghajtók. Az egyetlen dolog, ami lehet nyomni itt nem egyértelmű - ez CM_Get_Parent funkciót. Ő lesz a szülő eszközt. Valóban, minden „flash kártya”, vagy egy külső merevlemez egy összetett eszköz, és tiltsa meg a szülő eszközt. IsUSBDevice funkció kód a forráskódot, hogy csatlakozik a cikket.

SetupAPI nem teszi lehetővé, hogy információt (hang, kép) a különböző eszközöket. SetupAPI szánt le- és eszközök, készülékek stb jellemzők

Köszönöm szépen, egy ilyen cikket kért két hét, de semmi még közel fekvő nem található. Köszönöm szépen!

Kapcsolódó cikkek