+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 93.44 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Программирование на Visual C++

16.03.2011 11:20

Иногда в программах необходимо использовать возможность проверки типа носителя или его серийный номер. Причины могут быть разными от банального контроля устройств в системе до средств защит использующих привязку к железу. Сейчас я вам покажу как с помощью API реализовать эту простую задачу.

Нам понадобится всего 2 API - функции:

  • GetDriveType - определяет и возвращает тип носителя;
  • GetVolumeInformation - определяет информацию о носителе, среди которой содержится серийный номер.

Рассмотрим описание этих функций для С++ и Delphi. Первой будет функция GetDriveType, она очень простая и использует всего один параметр - указатель на том. Например "c:\","a:\" и т.д. Функция возвращает одно из следующих значений:

  • DRIVE_UNKNOWN - 0 : диск неопределен/не существует
  • DRIVE_NO_ROOT_DIR - 1 : неверный путь/ путь не указывает на том
  • DRIVE_REMOVABLE - 2 : тип устройства определяется как съемный (дискета, флешка и т.д.)
  • DRIVE_FIXED - 3 : тип устройства - фиксированный диск (жесткий диск)
  • DRIVE_REMOTE - 4 : тип устройства - удаленный(сетевой) диск
  • DRIVE_CDROM - 5 : это устройство CD-ROM
  • DRIVE_RAMDISK - 6 : виртуальный диск, созданный в оперативной памяти

C/C++

UINT WINAPI GetDriveType(
      LPCTSTR lpRootPathName //путь к диску
);

Delphi

function GetDriveType(
      lpRootPathName: PChar //путь к диску
): UINT; stdcall;

Замечание: Если в качестве параметра указать для С/С++ NULL, а для Delphi - nil то тип устройства будет определяться для текущего диска (с которого была запущена программа).

А теперь взглянем на функцию GetVolumeInformation. Тоже достаточно простая функция, однако использует параметров значительно больше.

C/C++

BOOL WINAPI GetVolumeInformation(
      LPCTSTR lpRootPathName,    //путь к сетевому или локальному
      // тому (пример: "\\MyServer\MyShare\" или "C:\".
      LPTSTR lpVolumeNameBuffer, //буфер - в котором будет храниться
                      // имя тома
      DWORD nVolumeNameSize,     //размер буфера
      LPDWORD lpVolumeSerialNumber, //серийный номер тома
      LPDWORD lpMaximumComponentLength, //размер тома
      LPDWORD lpFileSystemFlags, //тип файловой системы
      LPTSTR lpFileSystemNameBuffer, //название файловой системы
      DWORD nFileSystemNameSize //размер буфера под название ФС
);

Delphi

function GetVolumeInformation(
      lpRootPathName: PChar;    //путь к сетевому или локальному
       //тому (пример: "\\MyServer\MyShare\" или "C:\".
      lpVolumeNameBuffer: PChar; //буфер - в котором будет храниться
                             //   имя тома
      nVolumeNameSize: DWORD;     //размер буфера
      lpVolumeSerialNumber: PDWORD; //серийный номер тома
      var lpMaximumComponentLength, lpFileSystemFlags: DWORD; //размер
                                        // тома и тип файловой системы
      lpFileSystemNameBuffer: PChar; //название файловой системы
      nFileSystemNameSize: DWORD //размер буфера под название ФС
): BOOL; stdcall;

Замечание: Если в качестве первого параметра указать для С/С++ NULL, а для Delphi - nil то функция будет выполняется для текущего диска (с которого была запущена программа).

Ну а теперь собственно для пущего интересу приведу пример, как привязать программу к устройству. В данном примере будем привязывать программу к флешке. Смотрим пример:

C/C++

#include 
#include 
#include 
#include 
using namespace std;

int main() {
        // Получаем тип носителя с которого запущена программа
        unsigned int drive_type = GetDriveType( NULL );

        char VolumeNameBuffer[100];
        char FileSystemNameBuffer[100];
        DWORD sz,fs;
        unsigned long drive_sn;
        GetVolumeInformationA(
                NULL,
                VolumeNameBuffer,
                100,
                &drive_sn,
                sz,
                fs,
                FileSystemNameBuffer,
                100
        );
        cout << "Volume serial number:\t";
        if(drive_sn == 1018821877)     //сравниваем серийный номер
                cout << "correct" << endl;
        else
                cout << "invalid" << endl;
        cout << "Drive type:\t";
        if(drive_type == DRIVE_REMOVABLE)
                cout << "correct" << endl;
        else
                cout << "invalid" << endl;
        getch();
}

Delphi

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,windows;

var
 SerialNum,dtyp:DWORD;
 a,b:DWORD;
 Buffer,disk :Array[0..255]of char;
begin
  dtyp:=GetDriveType(nil);
  if dtyp = DRIVE_REMOVABLE then
    writeln('Disk(type): Yes')
  else
    writeln('Disk(type): No');
  GetVolumeInformation(
                nil,
                Buffer,
                sizeof(Buffer),
                @SerialNum,
                a,
                b,
                nil,
                0);
  if SerialNum = 1018821877 then //сравниваем серийный номер
    writeln('S\N: Yes')
  else
    writeln('S\N: No');
  readln;
end.

Замечание: Может возникнуть вопрос, а как узнать серийник диска, чтобы знать с чем сравнивать? Очень просто, для этого пишем тестовую прогу, в которой пишем следующий код:

C/C++

...
    GetVolumeInformationA(NULL, VolumeNameBuffer,100,
                   &drive_sn,sz,fs,FileSystemNameBuffer,100);
...

Delphi

...
     GetVolumeInformation(nil,Buffer,sizeof(Buffer),
             @SerialNum, a,b, nil, 0);
     writeln('S/N drive: ',SerialNum);
     readln;
...
  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года