Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
QWIPQ
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 359
Записей в блоге: 2
1

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

07.05.2012, 13:13. Просмотров 1440. Ответов 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 надо как-то присвоить в переменную, а вот как? помогите пжл разобраться... заранее спс

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Вложения
Тип файла: rar файлы проекта.rar (192.8 Кб, 25 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 13:13
Ответы с готовыми решениями:

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

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

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

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

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

4
LK
Заблокирован
07.05.2012, 13:22 2
http://docs.embarcadero.com/products...tem_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
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 359
Записей в блоге: 2
07.05.2012, 13:45  [ТС] 3
изменил на:
C++
1
2
TGUID GUID_DEVCLASS_DISKDRIVE;
GUID_DEVCLASS_DISKDRIVE = StringToGUID("{f1ce5fad-7724-11e1-8fef-005056c00008}");
эффекта не дало, знач возможно дело в SetupDiGetClassDevsA(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, 2);
она возвращает указатель на набор информации об устройстве...
если бы эта функция неправильно бы работала программа бы закрывалась а такого не происходит...
вот как вызывается проекте на делфи:
Delphi
1
DrivesPnPHandle := SetupDiGetClassDevsA(@GUID_DEVCLASS_DISKDRIVE, nil, 0, 2);
мож я её не так вызвал?!О_о
0
LK
Заблокирован
07.05.2012, 13:50 4
А как вы ёё вызывал?
1
QWIPQ
142 / 121 / 14
Регистрация: 10.10.2011
Сообщений: 359
Записей в блоге: 2
07.05.2012, 16:24  [ТС] 5
Цитата Сообщение от LK Посмотреть сообщение
А как вы ёё вызывал?
C++
1
DrivesPnPHandle = SetupDiGetClassDevsA(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, 2);
Добавлено через 1 час 29 минут
разобрался в чем проблема была но вопрос не решен:
1.
Цитата Сообщение от QWIPQ Посмотреть сообщение
SetupDiGetClassDevsA(&GUID_DEVCLASS_DISKDRIVE, NULL, NULL, 2);
проблема именно в этой функции и её последнем значении он является флагом/классом устройств которые мы сканируем... никак не могу понять как эту функцию настроить для USB...
2. еще есть маленькое НО тот индекс который мы передаем в эту функцию я так понял он является номером устройства... если сделать так:
C++
1
DrivesPnPHandle = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES);
и прокрутить циклом индексы то все флешки вылетают как миленькие... а чтобы удалить отдельную флешку надо знать её индекс

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

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

Добавлено через 1 час 1 минуту
все заработало LK спасибо что помог, сколько смог
0
07.05.2012, 16:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2012, 16:24

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru