Данный код отлично собирается как Win32 Application.
Подскажите как реализовать с использованием MFC
гугл выдал кусок кода:
Цитата:
Чтобы приложение основанное на MFC могло отловить и отроботать данное сообщение в карте сообщений необходимо написать следующее:
Код:
ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange)
Из значений которые может принимать wParam для интересующего нас случая важно следующее: DBT_DEVICEARRIVAL – подключили новое устройство DBT_DEVICEREMOVECOMPLETE – устройство было отключено
Код:
#include <dbt.h>
LRESULT OnDeviceChange(WPARAM wParam, LPARAM lParam)
{
// следует обратить внимание на эту строку:
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
switch(wParam)
{
case DBT_DEVICEARRIVAL:
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
MessageBox (NULL, _T(“Устройство подключено”), _T("WM_DEVICECHANGE"), MB_OK );
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
MessageBox (NULL, _T(“Устройство отключено”), _T("WM_DEVICECHANGE"), MB_OK );
}
}
break;
}
}
НО код компилируется с ошибкой:
Код:
error C4716: 'OnDeviceChange' : must return a value Error executing cl.exe.
if (nEventType == DBT_DEVICEARRIVAL)
{
if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
for (int n = 0; n < 32; n++)
{
if (IsBitSet (volume->dbcv_unitmask, n))
{
log.Format ("Drive %c: Inserted\n", n + 'A');
::AfxMessageBox(log);
log.Format ("%c", n + 'A');
// Флешка подключена. Имя флешки в системе содержит строковая переменная log
}
}
}
}
if (nEventType == DBT_DEVICEREMOVECOMPLETE)
{
if (volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
{
for (int n = 0; n < 32; n++)
{
if (IsBitSet (volume->dbcv_unitmask, n))
{
log.Format ("Drive %c: Removed\n", n + 'A');
::AfxMessageBox(log);
log.Format ("%c", n + 'A');
// Флешка извлечена. Имя флешки в системе содержит строковая переменная log
}
}
}
}