C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: как получить букву диска  (Прочитано 6024 раз)
mixa
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 7


« : 06 декабря 2013, 01:09:45 »

всем добрый день! есть строка вида \\?\usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}.  это серийный номер флешки. каким образом мне получить из этого букву этой флешки в системе?
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #1 : 06 декабря 2013, 07:35:27 »

Есть функция GetVolumePathNamesForVolumeName. И есть пример.
Записан
mixa
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 7


« Ответ #2 : 07 декабря 2013, 00:58:14 »

посмотрел пример, пишу следующе:    


Код
DWORD  CharCount = MAX_PATH + 1;
WCHAR Names[MAX_PATH + 1];
WCHAR *ww = L"\\?\usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}";
GetVolumePathNamesForVolumeNameW(ww, Names, CharCount, &CharCount);
                       
как мне теперь из Names получить букву моей флешки??

Код
Memo1->Lines->Add(Names);
   выводит что то не то....   (c++ builder6)
« Последнее редактирование: 07 декабря 2013, 02:16:39 от volvo877 » Записан
mixa
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 7


« Ответ #3 : 07 декабря 2013, 01:05:55 »

а строчка из примера - Names = (PWCHAR) new BYTE [CharCount * sizeof(WCHAR)];

выдает ошибку..
Записан
volvo877
Глобальный модератор
***

Сказали спасибо: +736/-1
Offline Offline

Сообщений: 891


« Ответ #4 : 07 декабря 2013, 02:15:45 »

Код
WCHAR *ww = L"\\\\?\\usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}";
больше похоже на правильное задание серийного номера, правда?
Записан
mixa
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 7


« Ответ #5 : 10 декабря 2013, 00:35:08 »

 такая ситуация, у меня есть серийный номер флешки ввиде строки -

\\\\?\\usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

и есть буква этой флешки которую ей назначила система (в моем случае это F). теперь мне нужно получить дескриптор этой флешки и удалить ее, пишу следующий код:

H1 =CreateFile("\\\\?\\usb#vid_13fe&pid_4100#070c28670e74be11#{ a5dcbf10-6530-11d2-901f-00c04fb951ed}",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FI LE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//H1 =CreateFile("\\\\.\\F:",GENERIC_READ|GENERIC_WRITE,FILE_SHAR E_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

unsigned long ReturnedBytes;
if(DeviceIoControl(H1, FSCTL_DISMOUNT_VOLUME,NULL, 0, NULL, 0, &ReturnedBytes, NULL))
{ShowMessage("USB демонтирован"); }
else
{ShowMessage (SysErrorMessage(GetLastError()));}



так вот, когда я получаю дескриптор моей флешки, подставляя туда букву флешки (закоментированая строчка), то все проходит нормально и флешка демонтируется, а когда в место буквы подставляю строчку -
\\\\?\\usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}, то получается ошибка "неправильная функция". обе строчки соответствуют одной и той же флешке. что тут не так?Непонимающий?
   
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #6 : 10 декабря 2013, 07:03:35 »

Та длинная строка - это номер тома. В CreateFile надо передавать именно путь, т.е. букву диска и т.д.
Записан
mixa
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 7


« Ответ #7 : 23 декабря 2013, 00:39:10 »

а можно открыть флешку как обычный файл и прочитать ее, таким образом выщемить где нить ее серийник??

пишу такой код:

H =CreateFile(buf, 0,FILE_SHARE_READ , NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); // открыть диск как файл и прочитать из начала серийник
                char sim;
                DWORD buf_3;
                int u=1;
                while (u<50)
                 {
                         if(ReadFile(H, &sim,sizeof(sim),&buf_3,NULL))
                          {
                                   ShowMessage("1111");
                            Memo1->Lines->Add(sim);
                          }
                           else
                           {
                             Memo1->Lines->Add(SysErrorMessage(GetLastError()));
                            }
                          u++;
                 }

но пишет что " отказано в доступе ". что тут не так?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: