Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Портирование из сишного файла, проверьте правильность   Найти похожие ветки 

 
trubin ©   (2008-01-27 20:26) [0]

typedef enum _STORAGE_MEDIA_TYPE {
   DDS_4mm = 0x20,            // Tape - DAT DDS1,2,... (all vendors)    
   CD_ROM,                    // Opt_Disk - CD
   CD_R,                      // Opt_Disk - CD-Recordable (Write Once)
   CD_RW,                     // Opt_Disk - CD-Rewriteable
   DVD_ROM,                   // Opt_Disk - DVD-ROM
   DVD_R,                     // Opt_Disk - DVD-Recordable (Write Once)
   DVD_RW                    // Opt_Disk - DVD-Rewriteable    
} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;

typedef enum _STORAGE_BUS_TYPE {
   BusTypeUnknown = 0x00,
   BusTypeScsi,
   BusTypeAtapi,
   BusTypeAta,
   BusType1394,
   BusTypeSsa,
   BusTypeFibre,
   BusTypeUsb,
   BusTypeRAID,
   BusTypeMaxReserved = 0x7F
} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;

typedef struct _DEVICE_MEDIA_INFO {
   union {
       struct {
           LARGE_INTEGER Cylinders;
           STORAGE_MEDIA_TYPE MediaType;
           DWORD TracksPerCylinder;
           DWORD SectorsPerTrack;
           DWORD BytesPerSector;
           DWORD NumberMediaSides;
           DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values.
       } DiskInfo;

       struct {
           LARGE_INTEGER Cylinders;
           STORAGE_MEDIA_TYPE MediaType;
           DWORD TracksPerCylinder;
           DWORD SectorsPerTrack;
           DWORD BytesPerSector;
           DWORD NumberMediaSides;
           DWORD MediaCharacteristics; // Bitmask of MEDIA_XXX values.
       } RemovableDiskInfo;

       struct {
           STORAGE_MEDIA_TYPE MediaType;
           DWORD   MediaCharacteristics; // Bitmask of MEDIA_XXX values.
           DWORD   CurrentBlockSize;
           STORAGE_BUS_TYPE BusType;
           union {
               struct {
                   BYTE  MediumType;
                   BYTE  DensityCode;
               } ScsiInformation;
           } BusSpecificData;
       } TapeInfo;
   } DeviceSpecific;
} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;

////////////////////////////////////////////////////////////////////////////

PSTORAGE_MEDIA_TYPE = ^STORAGE_MEDIA_TYPE;
 STORAGE_MEDIA_TYPE = (
   DDS_4mm = $20,            // Tape - DAT DDS1,2,... (all vendors)
   CD_ROM,                    // Opt_Disk - CD
   CD_R,                      // Opt_Disk - CD-Recordable (Write Once)
   CD_RW,                     // Opt_Disk - CD-Rewriteable
   DVD_ROM,                   // Opt_Disk - DVD-ROM
   DVD_R,                     // Opt_Disk - DVD-Recordable (Write Once)
   DVD_RW                    // Opt_Disk - DVD-Rewriteable    
 );

 PSTORAGE_BUS_TYPE = ^STORAGE_BUS_TYPE;
 STORAGE_BUS_TYPE = (
   BusTypeUnknown = $00,
   BusTypeScsi,
   BusTypeAtapi,
   BusTypeAta,
   BusType1394,
   BusTypeSsa,
   BusTypeFibre,
   BusTypeUsb,
   BusTypeRAID,
   BusTypeMaxReserved = $7F
 );

Common_Disk_Info = record
   Cylinders:            LARGE_INTEGER;
   MediaType:            STORAGE_MEDIA_TYPE;
   TracksPerCylinder:    DWORD;
   SectorsPerTrack:      DWORD;
   BytesPerSector:       DWORD;
   NumberMediaSides:     DWORD;
   MediaCharacteristics: DWORD; // Bitmask of MEDIA_XXX values.
 end;

 Scsi_Information = record
   MediumType:  BYTE;
   DensityCode: BYTE;
 end;

 Bus_Specific_Data = record
   ScsiInformation: Scsi_Information;
 end;

 Tape_Info = record
   MediaType:                STORAGE_MEDIA_TYPE;
   MediaCharacteristics:     DWORD;      // Bitmask of MEDIA_XXX values.
   CurrentBlockSize:         DWORD;
   BusType:                  STORAGE_BUS_TYPE;
   BusSpecificData:          Bus_Specific_Data;
 end;

 Device_Specific = record
   DiskInfo:            Common_Disk_Info;
   RemovableDiskInfo:   Common_Disk_Info;
   TapeInfo:            Tape_Info;
 end;

 Device_Media_Info = record
   DeviceSpecific: Device_Specific;
 end;

 PGET_MEDIA_TYPES = ^GET_MEDIA_TYPES;
 GET_MEDIA_TYPES = record
   DeviceType: DWORD;
   MediaInfoCount: DWORD;
   MediaInfo: array [0..0] of Device_Media_Info;
 end;

Можно видимо обойтись без типов Bus_Specific_Data  и  Device_Specific


 
trubin ©   (2008-01-27 20:27) [1]

Забыл:

typedef struct _GET_MEDIA_TYPES {
   DWORD DeviceType;          
   DWORD MediaInfoCount;
   DEVICE_MEDIA_INFO MediaInfo[1];
} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;


 
Рамиль ©   (2008-01-27 20:54) [2]

packed record
иначе, если это будет передаваться в функции dll неизвестного происхождения, могут быть проблемы.


 
Riply ©   (2008-01-27 22:03) [3]

> [2] Рамиль ©   (27.01.08 20:54)
> packed record

Ой не факт. Столько раз нарывалась с этим выравниванием, и не сосчитаешь :)

> иначе, если это будет передаваться в функции dll неизвестного происхождения, могут быть проблемы.

Проблеммы могут быть и с packed record. IMHO, в каждом случае надо подходить индивидуально,
с оглядкой на "функции dll неизвестного происхождения" в которых будет использоваться.


 
Игорь Шевченко ©   (2008-01-27 22:07) [4]


> Проблеммы могут быть и с packed record. IMHO, в каждом случае
> надо подходить индивидуально,
> с оглядкой на "функции dll неизвестного происхождения" в
> которых будет использоваться.


Именно так. Я обычно сначала везде ставлю packed, потом при ошибках начинаю вставлять байты-заполнители.


 
Anatoly Podgoretsky ©   (2008-01-27 22:14) [5]

> Игорь Шевченко  (27.01.2008 22:07:04)  [4]

Неизвестного, читай не соблюдающего каноны ДЛЛ происхождения.


 
Игорь Шевченко ©   (2008-01-28 00:45) [6]

Anatoly Podgoretsky ©   (27.01.08 22:14) [5]

Даже известные, MS-овские и те грешат несоблюдением канонов.


 
Германн ©   (2008-01-28 00:58) [7]


> Игорь Шевченко ©   (28.01.08 00:45) [6]

Теперь понятно почему три разных сишника мне прошлым летом дали три разных ответа о выравнивании в struct. Пришлось ждать появления автора ТЗ, чтобы узнать нужное. :)


 
Riply ©   (2008-01-28 09:29) [8]

> [5] Anatoly Podgoretsky ©   (27.01.08 22:14)
> Неизвестного, читай не соблюдающего каноны ДЛЛ происхождения.

> [6] Игорь Шевченко ©   (28.01.08 00:45)
> Даже известные, MS-овские и те грешат несоблюдением канонов.

А что это за "каноны", о которых идет речь
и в каких заповедях они описаны ?


 
ketmar ©   (2008-01-28 09:36) [9]

>[8] Riply©(28.01.08 09:29)
неявно. из традиции следует, что packed.


 
Игорь Шевченко ©   (2008-01-28 09:52) [10]

Riply ©   (28.01.08 09:29) [8]

Каконы просты - описания структур не зависят от языка программирования.


 
Riply ©   (2008-01-28 11:16) [11]

> [9] ketmar ©   (28.01.08 09:36)
> [10] Игорь Шевченко ©   (28.01.08 09:52)
> Каконы просты - описания структур не зависят от языка программирования.

Спасибо.


 
trubin ©   (2008-01-28 19:20) [12]

Кроме packed ничего не смущает?


 
clickmaker ©   (2008-01-28 19:24) [13]


> [3] Riply ©   (27.01.08 22:03)
> > [2] Рамиль ©   (27.01.08 20:54)
> > packed record
>
> Ой не факт. Столько раз нарывалась с этим выравниванием,
> и не сосчитаешь :)

это, наверно, в случаях:
struct SomeCStruct {
 DWORD Field1;
 BYTE Field2: 4;
 BYTE Field3: 3;
 BYTE Field4: 1;
}
? :)


 
guav ©   (2008-01-28 19:26) [14]

> Device_Specific = record
>   DiskInfo:            Common_Disk_Info;
>   RemovableDiskInfo:   Common_Disk_Info;
>   TapeInfo:            Tape_Info;
> end;

Неверно, там не struct а union
Device_Specific = record
  case Integer of
    ...
end;


 
guav ©   (2008-01-28 19:31) [15]

И вообще не мучайся, ищи готовые структуры тут http://jedi-apilib.sourceforge.net/


 
trubin ©   (2008-01-28 19:53) [16]


> guav ©   (28.01.08 19:31) [15]
> И вообще не мучайся, ищи готовые структуры тут http://jedi-
> apilib.sourceforge.net/


Вот спасибо, нашел то что нужно.


> Неверно, там не struct а union
> Device_Specific = record
>   case Integer of
>     ...
> end;


ты прав разобрался


 
Riply ©   (2008-01-28 21:50) [17]

>  [13] clickmaker ©   (28.01.08 19:24)
> это, наверно, в случаях:
> struct SomeCStruct {

Нет, не в этих. Или Вы изволите издеваться ? :))


 
Игорь Шевченко ©   (2008-01-28 22:18) [18]

Кстати, для перечислимых типов хорошо бы явно указывать их размер
{$Z+} приводит к тому, что перечислимые типы занимают 4 байта (как в С для Win32 по умолчанию), вне зависимости от количества элементов типа.


 
guav ©   (2008-01-29 00:47) [19]

> [18] Игорь Шевченко ©   (28.01.08 22:18)

Кстати, как задать размер для перечислимых типов в С (или хотя бы в С++) ? Есть ли переносимый (портабельный) вариант ?


 
Германн ©   (2008-01-29 00:51) [20]


> Игорь Шевченко ©   (28.01.08 22:18) [18]
>
> Кстати, для перечислимых типов хорошо бы явно указывать
> их размер
> {$Z+} приводит к тому, что перечислимые типы занимают 4
> байта

Взял на заметку, поскольку с СИ-шником я теперь часто буду взаимодействовать. А он таких тонкостей не знает.


 
Игорь Шевченко ©   (2008-01-29 09:45) [21]

guav ©   (29.01.08 00:47) [19]


> Кстати, как задать размер для перечислимых типов в С (или
> хотя бы в С++) ? Есть ли переносимый (портабельный) вариант
> ?


Размер перечислимых типов в С это sizeof(int)
А дальше уже от компилятора зависит, какие гайки он умеет


 
clickmaker ©   (2008-01-29 10:55) [22]


> [17] Riply ©   (28.01.08 21:50)
>
> Нет, не в этих. Или Вы изволите издеваться ? :))

Да ну что Вы, Александра, как можно!
туповатый мужской юмор, не более )


 
guav ©   (2008-01-29 11:18) [23]

> [20] Германн ©   (29.01.08 00:51)

Для MS Visual C++ можно задавать размер так:
typedef enum _STORAGE_MEDIA_TYPE : WORD {
  ...  
} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;

Мне это не понравилось варнингом warning C4480: nonstandard extension used: specifying underlying type for enum, но если это не проблема, почему бы не воспользоватся.


> [21] Игорь Шевченко ©   (29.01.08 09:45)

Спасибо. Получается, не стоит использовать enum в структурах, которые должны сохраниться и при другом размере int (т.е. сохраняемых в бинарный файл).



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
2-1201604770
Звоновский
2008-01-29 14:06
2008.02.24
Помогите считать текст из Static чужого окна


6-1181112499
Сергей Колесник
2007-06-06 10:48
2008.02.24
UDP перехватчик


11-1179211668
WindLord
2007-05-15 10:47
2008.02.24
Проблема с отображением компонентов в KOL/МСК 2.60, Delphi 7


3-1192089119
Quart
2007-10-11 11:51
2008.02.24
Подключение к БД


2-1201456368
viRUS
2008-01-27 20:52
2008.02.24
Нестандартные формы