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

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

07.05.2012, 13:13. Показов 2345. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru