ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование_OLD > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

I need MFC solution
  #11  
Старый 20.05.2009, 01:34
Suteki
Новичок
Регистрация: 18.05.2009
Сообщений: 12
Провел на форуме:
129116

Репутация: 19
Exclamation I need MFC solution

Данный код отлично собирается как 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.
вставляю перед последний скобкой
Код:
return 0;
Появлятся 2 ошибки:
Код:
MainFrm.obj : error LNK2001: unresolved external symbol "public: long __thiscall CMainFrame::OnDeviceChange(unsigned int,long)" (?OnDeviceChange@CMainFrame@@QAEJIJ@Z)

Debug/FLA.exe : fatal error LNK1120: 1 unresolved externals
 

Решение под MFC
  #12  
Старый 21.05.2009, 03:24
Suteki
Новичок
Регистрация: 18.05.2009
Сообщений: 12
Провел на форуме:
129116

Репутация: 19
Smile Решение под MFC

Проблему решил. Привожу ниже мануал.
Мини-Мануал для MFC

1) В хайдер мейнфрейма (MainFrm.h) добавляем в описание класса прототип функции OnDeviceChangeprotected:)
PHP код:
BOOL OnDeviceChangeUINT nEventTypeDWORD dwData ); 
2) В мейнфрейм (MainFrm.cpp) подключаем хайдер dbt.h
PHP код:
#include <dbt.h> 
3) Дописываем в карту откликов после //}}AFX_MSG_MAP отклик ON_WM_DEVICECHANGE ()
PHP код:
ON_WM_DEVICECHANGE () 
4) В конец мейнфрейма дописываем следующий код:

PHP код:

bool inline IsBitSet 
(DWORD64 dwMaskUINT nTHBit)
{
    
DWORD64 dwBit 1;
    
dwBit <<= nTHBit;
    
dwMask &= dwBit;
    return 
dwMask true false;
}

BOOL CMainFrame::OnDeviceChangeUINT nEventTypeDWORD dwData )
{
    
BOOL bReturn CWnd::OnDeviceChange (nEventTypedwData);

    
DEV_BROADCAST_VOLUME *volume = (DEV_BROADCAST_VOLUME *)dwData;
    
CString log;

    if (
nEventType == DBT_DEVICEARRIVAL)
    {
        if (
volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
        {
            for (
int n 032n++)
            {
                if (
IsBitSet (volume->dbcv_unitmaskn))
                {
                    
log.Format ("Drive %c: Inserted\n"'A');
        ::
AfxMessageBox(log);

        
log.Format ("%c"'A');
        
// Флешка подключена. Имя флешки в системе содержит строковая переменная log
                
}
            }
        }
    }

    if (
nEventType == DBT_DEVICEREMOVECOMPLETE)
    {
        if (
volume->dbcv_devicetype == DBT_DEVTYP_VOLUME)
        {
            for (
int n 032n++)
            {
                if (
IsBitSet (volume->dbcv_unitmaskn))
                {
                    
log.Format ("Drive %c: Removed\n"'A');
        ::
AfxMessageBox(log);

        
log.Format ("%c"'A');
        
// Флешка извлечена. Имя флешки в системе содержит строковая переменная log
                
}
            }
        }
    }

    return 
bReturn;


Файл проекта + собранный exe
 
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ