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

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

07.05.2012, 13:13. Показов 2365. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru