Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een toepassing ontvangt een DBT_DEVICEQUERYREMOVE apparaatgebeurtenis wanneer een functie in het systeem heeft besloten een opgegeven apparaat te verwijderen. Wanneer de toepassing deze gebeurtenis ontvangt, moet deze bepalen of deze het opgegeven apparaat gebruikt en annuleren of voorbereiden op de verwijdering.
In het volgende voorbeeld onderhoudt een toepassing een open ingang, hFile, aan het bestand of apparaat dat wordt vertegenwoordigd door FileName. De toepassing registreert zich voor apparaatgebeurtenismeldingen op het onderliggende apparaat door de functie RegisterDeviceNotification aan te roepen, met behulp van een DBT_DEVTYP_HANDLE type meldingsfilter en de hFile-variabele op te geven in het dbch_handle lid van het filter.
De toepassing verwerkt de DBT_DEVICEQUERYREMOVE apparaatgebeurtenis door de geopende bestandsgreep voor het apparaat dat moet worden verwijderd te sluiten. In het geval dat het verwijderen van dit apparaat wordt geannuleerd, verwerkt de toepassing de DBT_DEVICEQUERYREMOVEFAILED apparaatgebeurtenis om de verbinding met het apparaat opnieuw te openen. Nadat het apparaat uit het systeem is verwijderd, verwerkt de toepassing de DBT_DEVICEREMOVECOMPLETE- en DBT_DEVICEREMOVEPENDING apparaatgebeurtenissen door de registratie van de meldingsgreep voor het apparaat ongedaan te maken en eventuele ingangen te sluiten die nog steeds geopend zijn voor het apparaat.
#include <windows.h>
#include <dbt.h>
#include <strsafe.h>
// ...
INT_PTR WINAPI WinProcCallback( HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam )
{
LPCTSTR FileName = NULL; // path to the file or device of interest
HANDLE hFile = INVALID_HANDLE_VALUE; // handle to the file or device
PDEV_BROADCAST_HDR pDBHdr;
PDEV_BROADCAST_HANDLE pDBHandle;
TCHAR szMsg[80];
switch (message)
{
//...
case WM_DEVICECHANGE:
switch (wParam)
{
case DBT_DEVICEQUERYREMOVE:
pDBHdr = (PDEV_BROADCAST_HDR) lParam;
switch (pDBHdr->dbch_devicetype)
{
case DBT_DEVTYP_HANDLE:
// A request has been made to remove the device;
// close any open handles to the file or device
pDBHandle = (PDEV_BROADCAST_HANDLE) pDBHdr;
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
}
return TRUE;
case DBT_DEVICEQUERYREMOVEFAILED:
pDBHdr = (PDEV_BROADCAST_HDR) lParam;
switch (pDBHdr->dbch_devicetype)
{
case DBT_DEVTYP_HANDLE:
// Removal of the device has failed;
// reopen a handle to the file or device
pDBHandle = (PDEV_BROADCAST_HANDLE) pDBHdr;
hFile = CreateFile(FileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
StringCchPrintf( szMsg, sizeof(szMsg)/sizeof(szMsg[0]),
TEXT("CreateFile failed: %lx.\n"),
GetLastError());
MessageBox(hWnd, szMsg, TEXT("CreateFile"), MB_OK);
}
}
return TRUE;
case DBT_DEVICEREMOVEPENDING:
pDBHdr = (PDEV_BROADCAST_HDR) lParam;
switch (pDBHdr->dbch_devicetype)
{
case DBT_DEVTYP_HANDLE:
// The device is being removed;
// close any open handles to the file or device
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
}
return TRUE;
case DBT_DEVICEREMOVECOMPLETE:
pDBHdr = (PDEV_BROADCAST_HDR) lParam;
switch (pDBHdr->dbch_devicetype)
{
case DBT_DEVTYP_HANDLE:
pDBHandle = (PDEV_BROADCAST_HANDLE) pDBHdr;
// The device has been removed from the system;
// unregister its notification handle
UnregisterDeviceNotification(
pDBHandle->dbch_hdevnotify);
// The device has been removed;
// close any remaining open handles to the file or device
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
}
return TRUE;
default:
return TRUE;
}
}
default:
return TRUE;
}
Verwante onderwerpen