Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2

Непонятная ошибка при переводе в кода(безопасного извлечения флешек) с Delphi на С++

07.05.2012, 13:13. Показов 2328. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предисловие:
делаю попытку сделать безопасное извлечение флешки, перекопал инет,msdn в итоге вот что получилось...
делаю на основе примера проекта на делфи который реально работает, но по какой-то причине отказался у меня компилироваться и в итоге я пользуюсь только кодом и exe файлом данного проекта...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
BOOL IsUSBDevice(DWORD DevInst)
{
    DWORD size;
    LPBYTE pData;
    BOOL usb = FALSE;
    if (CM_Get_Device_ID_Size(&size, DevInst, 0) == CR_SUCCESS)
    {
        if (size)
        {
            pData = (LPBYTE)GlobalAlloc(GPTR, size + 1);
            if (pData)
            {
                if (CM_Get_Device_ID(DevInst, (PCHAR)pData, size + 1,0) == CR_SUCCESS)
                {
                    *(pData + 7) = 0x00;
                    if (!strcmp((char*)pData, "USBSTOR"))
                        usb = TRUE;
                }
                GlobalFree(pData);
            }
        }
    }
    return usb;
}
 
BOOL RemoveUSBDevice(int index)  //{f1ce5fad-7724-11e1-8fef-005056c00008} - GUID флешки моей
{
    //объявляем переменные
    GUID GUID_DEVCLASS_DISKDRIVE; //GUID чего-то... хз чего поидее флешки
    HDEVINFO DrivesPnPHandle;     //набор информации об устройстве
    SP_DEVINFO_DATA DevInfo;      //структура SP_DEVINFO_DATA определяет устройство
    DWORD Parent;
    //вызываем функции
    DrivesPnPHandle = SetupDiGetClassDevsA(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, 2);//возвращает указатель на набор информации об устройстве
    if(DrivesPnPHandle == INVALID_HANDLE_VALUE)exit(1);//вообще ни к чему
    DevInfo.cbSize = sizeof(SP_DEVINFO_DATA);                  //эта строка свазана с нижеидущей из MSDN
    if(SetupDiEnumDeviceInfo(DrivesPnPHandle, index, &DevInfo))//функция возвращает SP_DEVINFO_DATA структуру,
    {                       //которая определяет элемент с информацией об устройстве в наборе информации об устройстве.
        if (IsUSBDevice(DevInfo.DevInst) && (CM_Get_Parent(&Parent, DevInfo.DevInst,0) == CR_SUCCESS))
        {
            CM_Request_Device_Eject(Parent, NULL, NULL, NULL, NULL);
        }
    }
    return FALSE;
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    RemoveUSBDevice(ListBox1->ItemIndex+1);
}
проблема в том, что когда доходит до строки, где выполняется SetupDiEnumDeviceInfo(DrivesPnPHandle, index, &DevInfo) возвращается флаг FALSE и дальше не идет выполнение программы... в проекте который я взял за основу есть исполняющий файл, который прикреплен к проекту SetupAPI.pas в нем прописано:
Delphi
1
2
3
4
const
  // Classes GUIDs
  GUID_DEVCLASS_NET: TGUID       = '{4D36E972-E325-11CE-BFC1-08002BE10318}';
  GUID_DEVCLASS_DISKDRIVE: TGUID = '{4D36E967-E325-11CE-BFC1-08002BE10318}';
у меня смутное подозрение, что GUID надо как-то присвоить в переменную, а вот как? помогите пжл разобраться... заранее спс
Вложения
Тип файла: rar файлы проекта.rar (192.8 Кб, 25 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2012, 13:13
Ответы с готовыми решениями:

Непонятная ошибка при разносе метода из кода класса
Не могу понять от чего происходит ошибка. Создал класс в VS 2008, создал метод демонстрации. Пока этот метод находится в теле класса, всё...

Как убрать возможность безопасного извлечения Wi-Fi-адаптера?
Доброго времени суток! Имеется usb wi-fi адаптер как убрать для него возможность безопасного извлечения? Ос: win10

Ошибки внешнего диска после безопасного извлечения в ОС
Здравствуйте уважаемые форумчане!Помогите пожалуйста,посмотрите смарт,что ждать и что можно предпринять,второй сигейт с ошибками(первый...

4
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
07.05.2012, 13:22
http://docs.embarcadero.com/pr... TGUID.html :
C++
1
2
3
TGUID myGuid0, myGuid1;
/* Create a new GUID from the string representation */
myGuid0 = StringToGUID("{00020400-0000-0000-C000-000000000046}");
У вас в делфийском коде в явном виде написно:
GUID_DEVCLASS_NET: TGUID
1
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.05.2012, 13:45  [ТС]
изменил на:
C++
1
2
TGUID GUID_DEVCLASS_DISKDRIVE;
GUID_DEVCLASS_DISKDRIVE = StringToGUID("{f1ce5fad-7724-11e1-8fef-005056c00008}");
эффекта не дало, знач возможно дело в SetupDiGetClassDevsA(&GUID_DEVCLASS_DISK DRIVE, NULL, NULL, 2);
она возвращает указатель на набор информации об устройстве...
если бы эта функция неправильно бы работала программа бы закрывалась а такого не происходит...
вот как вызывается проекте на делфи:
Delphi
1
DrivesPnPHandle := SetupDiGetClassDevsA(@GUID_DEVCLASS_DISKDRIVE, nil, 0, 2);
мож я её не так вызвал?!О_о
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
07.05.2012, 13:50
А как вы ёё вызывал?
1
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.05.2012, 16:24  [ТС]
Цитата Сообщение от LK Посмотреть сообщение
А как вы ёё вызывал?
C++
1
DrivesPnPHandle = SetupDiGetClassDevsA(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, 2);
Добавлено через 1 час 29 минут
разобрался в чем проблема была но вопрос не решен:
1.
Цитата Сообщение от QWIPQ Посмотреть сообщение
SetupDiGetClassDevsA(&GUID_DEVCLASS_DISK DRIVE, NULL, NULL, 2);
проблема именно в этой функции и её последнем значении он является флагом/классом устройств которые мы сканируем... никак не могу понять как эту функцию настроить для USB...
2. еще есть маленькое НО тот индекс который мы передаем в эту функцию я так понял он является номером устройства... если сделать так:
C++
1
DrivesPnPHandle = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
и прокрутить циклом индексы то все флешки вылетают как миленькие... а чтобы удалить отдельную флешку надо знать её индекс

оба эти момента связаны я так понял т.к. в зависимости от флага в первой функции индекс является соответствующим... проще говоря берется из расчета класса в котором мы проводим сканирование... если все классы то просто перечисляются устройства и им дается номер...

помогите плз определить правильный класс...

Добавлено через 1 час 1 минуту
все заработало LK спасибо что помог, сколько смог
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2012, 16:24
Помогаю со студенческими работами здесь

Delphi+MySQL+ADO - непонятная ошибка при чтении данных
Есть система, работающая с СУБД MySQL. Она хранит там свои внутренние данные. Для этой системы вручную создается база данных,...

Как избавиться от иконки безопасного извлечения устройства раз и навсегда?
Как избавиться от иконки безопасного извлечения устройства раз и навсегда, чтобы она исчезла совсем и больше никогда не появлялась?:angry:

Ошибка в переводе из Delphi в C++
Я перевожу программу из языка Delphi в С++. Вроде, всё переделал, а она всё равно не хочет работать так, как в Delphi...Не считает...

Исправить ошибки при переводе кода с C++
переводил программу с с++ на си шарп

Ошибки при переводе с Delphi
Почему то шаг все время не такой как надо, а к нему добавляется какое то число


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru