powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Перевести структуру DEVICE_MEDIA_INFO в РВ
6 сообщений из 6, страница 1 из 1
Перевести структуру DEVICE_MEDIA_INFO в РВ
    #37196248
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова уперся в создание структуры
Явно не хватает знаний чтобы создать такое в РВ (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
Перевести структуру DEVICE_MEDIA_INFO в РВ
    #37196527
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести структуру DEVICE_MEDIA_INFO в РВ
    #37196820
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести структуру DEVICE_MEDIA_INFO в РВ
    #37196902
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести структуру DEVICE_MEDIA_INFO в РВ
    #37197043
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Перевести структуру DEVICE_MEDIA_INFO в РВ
    #37197382
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky ,
Вы опять правы - команды другие: IOCTL_CDROM_хххх
и всё что можно узнать о CD/DVD носителе связано в основном с ними.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Перевести структуру DEVICE_MEDIA_INFO в РВ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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