Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Перевести структуру DEVICE_MEDIA_INFO в РВ / 6 сообщений из 6, страница 1 из 1
03.04.2011, 02:51
    #37196248
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести структуру DEVICE_MEDIA_INFO в РВ
Снова уперся в создание структуры
Явно не хватает знаний чтобы создать такое в РВ (10.5).
Подскажите как это сделать?
Код: plaintext
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.
typedef struct _DEVICE_MEDIA_INFO {
  union {
    struct {
      LARGE_INTEGER      Cylinders;
      STORAGE_MEDIA_TYPE MediaType;
      ULONG              TracksPerCylinder;
      ULONG              SectorsPerTrack;
      ULONG              BytesPerSector;
      ULONG              NumberMediaSides;
      ULONG              MediaCharacteristics;
    } DiskInfo;
    struct {
      LARGE_INTEGER      Cylinders;
      STORAGE_MEDIA_TYPE MediaType;
      ULONG              TracksPerCylinder;
      ULONG              SectorsPerTrack;
      ULONG              BytesPerSector;
      ULONG              NumberMediaSides;
      ULONG              MediaCharacteristics;
    } RemovableDiskInfo;
    struct {
      STORAGE_MEDIA_TYPE MediaType;
      ULONG              MediaCharacteristics;
      ULONG              CurrentBlockSize;
      STORAGE_BUS_TYPE   BusType;
      union {
        struct {
          UCHAR MediumType;
          UCHAR DensityCode;
        } ScsiInformation;
      } BusSpecificData;
    } TapeInfo;
  } DeviceSpecific;
} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
...
Рейтинг: 0 / 0
03.04.2011, 14:21
    #37196527
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести структуру DEVICE_MEDIA_INFO в РВ
AIS,

В PB нет аналога концепции union (в т.ч. и поэтому была создана эта библиотека ).
Для полной поддержки всех вариантов вам придется создать 3 отдельных структуры и соответственно 3 декларации внешних ф-й для них.
К счастью 2 из этих структур - одинаковы (фиксированные и извлекаемые диски), а третья относится к ленточным устройствам и вряд ли вас интересует.
Поэтому можно просто объявить исходную структуру на основе первой подструктуры и игнорировать ее содержимое для лент.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
typedef struct _DEVICE_MEDIA_INFO {
      LARGE_INTEGER      Cylinders;
      STORAGE_MEDIA_TYPE MediaType;
      ULONG              TracksPerCylinder;
      ULONG              SectorsPerTrack;
      ULONG              BytesPerSector;
      ULONG              NumberMediaSides;
      ULONG              MediaCharacteristics;
} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
...
Рейтинг: 0 / 0
03.04.2011, 19:27
    #37196820
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести структуру DEVICE_MEDIA_INFO в РВ
Anatoly Moskovsky ,
спасибо за совет.
Библиотека очень интересная. Неужели там есть всё от MSDN? ;)

Структуру я так как и Вы создал - "одинарную", но не мог понять как получать отдельно данные для "фиксированных и извлекаемых дисков".
Код: plaintext
1.
2.
GET_MEDIA_TYPES gmt
lul_lpOutBuffer =  2048  //uo_sizeof.sizeof(gmt)
DeviceIoControl( lul_hDisk, IOCTL_STORAGE_GET_MEDIA_TYPES_EX,  0 ,  0 , gmt, lul_lpOutBuffer, lul_lpBytesReturned,  0 )
Всё выводит, но (как я понимаю) только для структуры DiskInfo.
А как получить данные для структуры RemovableDiskInfo? Может флаг какой-то нужен или ещё что?
т.к. у всех компакт-дисков (CD-ROM, CD-R и CD-RW) значение MediaType всегда одинаково и = 51, а задача как раз и стоит в том, чтобы определить, что вставили в дисковод.
А может я ни в ту сторону копаю?
...
Рейтинг: 0 / 0
03.04.2011, 21:14
    #37196902
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести структуру DEVICE_MEDIA_INFO в РВ
AISА как получить данные для структуры RemovableDiskInfo? Может флаг какой-то нужен или ещё что?
т.к. у всех компакт-дисков (CD-ROM, CD-R и CD-RW) значение MediaType всегда одинаково и = 51, а задача как раз и стоит в том, чтобы определить, что вставили в дисковод.
А может я ни в ту сторону копаю?


Для removable все тоже самое.
Просто вы вероятно не совсем правильно поняли назначение этой ф-и (IOCTL_STORAGE_GET_MEDIA_TYPES_EX).
Поле MediaInfo в структуре GET_MEDIA_TYPES - это массив, длина которого хранится в поле MediaInfoCount. В элементах массива хранится структура DEVICE_MEDIA_INFO для каждого типа носителя поддерживаемого устройством (а не только текущего вставленного).

Насчет того, определить какой конкретно тип носителя вставлен, то вероятно для этого есть какая-то другая функция. Я не в курсе.
...
Рейтинг: 0 / 0
03.04.2011, 23:46
    #37197043
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести структуру DEVICE_MEDIA_INFO в РВ
Anatoly MoskovskyПросто вы вероятно не совсем правильно поняли назначение этой ф-и (IOCTL_STORAGE_GET_MEDIA_TYPES_EX).
Поле MediaInfo в структуре GET_MEDIA_TYPES - это массив, длина которого хранится в поле MediaInfoCount. В элементах массива хранится структура DEVICE_MEDIA_INFO для каждого типа носителя поддерживаемого устройством (а не только текущего вставленного).
Про поле MediaInfo я собственно так и понимал, но считал, что есть элемент массива для DiskInfo, и есть для RemovableDiskInfo.
В 1-ом случае покажет какой DEVICE (т.е. CD либо DVD устройство), а во 2-ом - какой туда вставлен компакт-диск.
А далее определяем "кто is who":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
/*STORAGE_MEDIA_TYPE enumerator values*/
...
Constant ULong CD_ROM= 51  // 0x33
Constant ULong CD_R= 52  // 0x34
Constant ULong CD_RW= 53  // 0x35
Constant ULong DVD_ROM= 54  // 0x36
Constant ULong DVD_R= 55  // 0x37
Constant ULong DVD_RW= 56  // 0x38
...
Получается, что RemovableDiskInfo ("извлекаемые диски") - это не компакт-диски, а внешний DEVICE, либо который вставляется в карман.
Думаю, что STORAGE_MEDIA_TYPE - это все-таки именно то, но Вы правы - "для этого есть какая-то другая функция", либо команда.

Спасибо за комментарий.
...
Рейтинг: 0 / 0
04.04.2011, 10:35
    #37197382
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перевести структуру DEVICE_MEDIA_INFO в РВ
Anatoly Moskovsky ,
Вы опять правы - команды другие: IOCTL_CDROM_хххх
и всё что можно узнать о CD/DVD носителе связано в основном с ними.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Перевести структуру DEVICE_MEDIA_INFO в РВ / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]