Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отследить подключение USB-накопителя

82K
20 мая 2012 года
dwight
6 / / 20.05.2012
Подскажите, как в Borland C++ Builder 6.0 отследить подключение usb-накопителя?

Например, чтобы при подключении флешки появлялось сообщение "Подключено".

Спасибо!
1
20 мая 2012 года
kot_
7.3K / / 20.01.2000
Хорошо и подробно разобрано здесь
82K
20 мая 2012 года
dwight
6 / / 20.05.2012
Спасибо за ответ, но ведь статья для Delphi! А мне нужен С++.
Адапитровать не получается, помоги примером?
Пробую писать:

 
Код:
HDEVNOTIFY WINAPI RegisterDeviceNotification(
  __in HANDLE hRecipient,
  __in LPVOID NotificationFilter,
  __in DWORD Flags
);
Выдаёт кучу ошибок. Пользуюсь Borland C++ Builder 6.0.
65K
20 мая 2012 года
verholom
48 / / 29.08.2011
Цитата: dwight
Спасибо за ответ, но ведь статья для Delphi! А мне нужен С++.
Адапитровать не получается, помоги примером?
Пробую писать:

 
Код:
HDEVNOTIFY WINAPI RegisterDeviceNotification(
  __in HANDLE hRecipient,
  __in LPVOID NotificationFilter,
  __in DWORD Flags
);
Выдаёт кучу ошибок. Пользуюсь Borland C++ Builder 6.0.



Тогда вы не умеете вызывать АПИ. Какие ошибки Вы получаете? Да и вряд-ли в поставке билдера не будет готовых заголовочных файлов...

326
20 мая 2012 года
sadovoya
757 / / 19.11.2005
Бывают недочеты в заголовочниках. Тогда лезем в MSDN и смотрим прототипы нужных ф-ций, а также dll-ки, где их искать. Может потребуются еще структуры, типы и константы. Далее вручную берем ф-ции из dll, например, по имени. Здесь потребуются апи: LoadLibrary, GetProcAddress и FreeLibrary. Про них читаем также в MSDN и они сами уж точно есть в заголовочниках.
326
20 мая 2012 года
sadovoya
757 / / 19.11.2005
Кстати, in-ы в коде зачем пишите? Они для сведения в MSDN. Out-ы тоже.
82K
20 мая 2012 года
dwight
6 / / 20.05.2012
Я новичок, поэтому, толком не соображаю в этой теме.
Цитата: sadovoya
Бывают недочеты в заголовочниках. Тогда лезем в MSDN и смотрим прототипы нужных ф-ций, а также dll-ки, где их искать. Может потребуются еще структуры, типы и константы. Далее вручную берем ф-ции из dll, например, по имени. Здесь потребуются апи: LoadLibrary, GetProcAddress и FreeLibrary. Про них читаем также в MSDN и они сами уж точно есть в заголовочниках.


Блин всё это так долго, мне нужно очень срочно((
Неужели нет готового решения?
Вот мой код:

Код:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#include <windows.h>
#include <IniFiles.hpp>
#include <fstream.h>

#include <jpeg.hpp>
#include <vcl.h>

#include "Unit1.h"
#include <vector>
#include <string>
using namespace std;

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HDEVNOTIFY WINAPI RegisterDeviceNotification(
  __in HANDLE hRecipient,
  __in LPVOID NotificationFilter,
  __in DWORD Flags
);

...
Выдаёт:
Цитата:
[C++ Error] Unit1.cpp(45): E2356 Type mismatch in redeclaration of '__stdcall RegisterDeviceNotificationA(void *,void *,unsigned long)'
[C++ Error] winuser.h(3229): E2344 Earlier declaration of '__stdcall RegisterDeviceNotificationA(void *,void *,unsigned long)'
[C++ Error] Unit1.cpp(46): E2063 Illegal initialization



Я реализовал такое уже на Visual C#, в IDE MS Visual C# 2010. И всё работало, вот код:

Код:
{StructLayout(LayoutKind.Sequential)]
public struct DEV_BROADCAST_VOLUME
{
    public int dbcv_size;
    public int dbcv_devicetype;
    public int dbcv_reserved;
    public int dbcv_unitmask;
}


const int WM_DEVICECHANGE = 0x0219;
const int DBT_DEVICEARRIVAL = 0x8000;
const int DBT_DEVTYP_VOLUME = 0x00000002;


protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_DEVICECHANGE && m.WParam.ToInt32() == DBT_DEVICEARRIVAL)
    {
        int devType = Marshal.ReadInt32(m.LParam, 4);
        if (devType == DBT_DEVTYP_VOLUME)
        {
            DEV_BROADCAST_VOLUME disk;
            disk = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
            string drives = "";
            for (int i = 0; disk.dbcv_unitmask != 0; i++)
            {
                if ((disk.dbcv_unitmask & 1) == 1) { drives += char.ToString((char)(i + 65)) + ": "; }
                disk.dbcv_unitmask = disk.dbcv_unitmask >> 1;
            }

            MessageBox.Show("флешка подключена, буква - " + drives);

        }
    }
    if (m.Msg == WM_DEVICECHANGE && m.WParam.ToString() == "32772")
    {
        MessageBox.Show("флешка отключена");
    }
    base.WndProc(ref m);
}
Может кто нибудь поможет адаптировать под C++ Builder?
82K
20 мая 2012 года
dwight
6 / / 20.05.2012
ОК, я поправил код и ошибки пропали)) Просто не туда воткнул. Получилось вот так (ошибок нет):

Код:
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    HDEVNOTIFY WINAPI RegisterDeviceNotification(
      HANDLE hRecipient,
      LPVOID NotificationFilter,
      DWORD Flags
    );
   
    //
    //остальной код
    //
}
Подскажите пожалуйста как обработать событие? Этим кодом мы "Подписались" на отправку месседжей при изменениях в оборудовании, правильно? Как теперь обработать подключение флешки?
Я так понимаю нужно копать в сторону WM_DEVICECHANGE, нашёл такие статьи по теме: раз, два, три, но только как из этого сложить то что мне надо знаний не хватает... Помогите?
7
20 мая 2012 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: dwight
Этим кодом мы "Подписались" на отправку месседжей при изменениях в оборудовании, правильно?

Неправильно,этим кодом Вы ещё ничего не сделали,а описали прототип функции в функции…эээ,BCB не знаю,но в чём-то,имеющем отношение к главной форме
Надо вызвать эту функцию с нужными параметрами(для этого надо прочесть MSDN),а затем в функции окна ловить означенное событие.Лень читать MSDN,но из названий параметров полагаю,что hRecipient—дескриптор окна,NotificationFilter—что ловить будем,Flags—какие-то флаги,наверняка можно в 0 обратить
За всем остальным—по любой из предоставленных ссылок(ну или лучше по всем)

465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
 
Код:
HDEVNOTIFY WINAPI RegisterDeviceNotification(
  __in HANDLE hRecipient,
  __in LPVOID NotificationFilter,
  __in DWORD Flags
);
Блин че за проблемы. Вам же даже указали что все параметры входные. Не всегда так бывает, бывает 8 параметров и не указано где входной где выходной.
Насчёт флагов наверняка есть ссылочка в описании функции где они все отдельно описаны. Первый параметр не лазя в мсдн понятно что это хендл(дескриптор) , и переведя описание первого параметра наверняка можно понять о чём реч.

Вы в мсдн были? Я был, всё описано.
1 - й параметр хендл окна или службы которое получит событие устройства указанное во втором параметре. Можно использовать этот хендл вызывая эту функцию несколько раз
2 -й параметр указатель на структуру которую вы должны заполнить перед вызовом. Открываете описание структуры в мсдн и заполняете, скорее всего не все поля обязательны к заполнению.

И не забываем вызвать UnregisterDeviceNotification, даже не открывал описание но скорее всего она будет требовать один единственный параметр, хендл который вам даст RegisterDeviceNotification.
82K
21 мая 2012 года
dwight
6 / / 20.05.2012
Не получается(( Пишу:

 
Код:
HDEVNOTIFY WINAPI RegisterDeviceNotification(
  Form1->Handle,
  DBT_DEVTYP_VOLUME,
  DEVICE_NOTIFY_WINDOW_HANDLE
);
Выдаёт ошибку (строка Form1->Handle,):
Цитата:
[C++ Error] Unit1.cpp(54): E2293 ) expected


Что делать?

465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: verholom
[quote=dwight;82599]... Да и вряд-ли в поставке билдера не будет готовых заголовочных файлов...



Особенно если учитывать что это есть в Windows.h

465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
Не видно чтоб вы структуру заполнили. Реч про второй параметр

И куда вы собрались хендл принимать, в WINAPI ??? Там тогда равно пропущено
82K
21 мая 2012 года
dwight
6 / / 20.05.2012
Цитата: QWERYTY
Не видно чтоб вы структуру заполнили. Реч про второй параметр

И куда вы собрались хендл принимать, в WINAPI ???


А как тогда.. До меня что то не доходит, покажите на примере пожалуйста. Просто срочно надо((

465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
Например по нажатию кнопки, вы сразу пишите:
Код:
HDEVNOTIFY hdevnotify;
DEV_BROADCAST_HDR dbh;

Потом вы её заполняете:
dbh->... = значение;
dbh->... = значение;
dbh->... = значение;

И лиш потом вызываете функцию, примерно так:

hdevnotify = RegisterDeviceNotification(Form1->Handle, &dbh, DEVICE_NOTIFY_WINDOW_HANDLE);
465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
Не так оказалось всё просто. Там одно из полей обращается в ещё одну структуру которую вы тоже должны заполнить.
Вы бродите по мсдн пока все поля всех структур не станут простыми типами.
465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: dwight
...

Я реализовал такое уже на Visual C#, в IDE MS Visual C# 2010. ...



Вы уверенны что именно вы это реализовали? Судя по задаваемым вопросам это не возможно!!!

465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: dwight
Не получается(( Пишу:

 
Код:
HDEVNOTIFY WINAPI RegisterDeviceNotification(
  Form1->Handle,
  DBT_DEVTYP_VOLUME,
  DEVICE_NOTIFY_WINDOW_HANDLE
);
Выдаёт ошибку (строка Form1->Handle,):
Цитата:
[C++ Error] Unit1.cpp(54): E2293 ) expected


Что делать?



DBT_DEVTYP_VOLUME передаёте. Вам же пишут в описании что это "Pointer".
Либо так &DBT_DEVTYP_VOLUME, либо так PDBT_DEVTYP_VOLUME.

Это я про передачу параметра. А каким этот параметр должен быть вам мсдн подскажет

465
21 мая 2012 года
QWERYTY
595 / / 25.03.2012
Цитата: sadovoya
Бывают недочеты в заголовочниках. ...



Да, это действительно так. Лично один раз столкнулся в эмбаркадеровском делфи. Судя из описания в мсдн функция должна быть в библиотеке User32.dll и быть описана в модуле Windows. Никак не мог воспользоваться пока не загрузил библиотеку.
Функция действительно оказалась на месте, мсдн не обманул.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог