Конференция "WinAPI" » Как это выгладит в delphi?
 
  • EgorovAlex © (27.03.12 08:11) [0]
    Интересует такая строка:
    LPPROFILEINTS lpProfileInts;



    Вот описание типа:

    typedef enum {
       PFDT_INT, PFDT_DWORD, PFDT_STRING, PFDT_INTARRAY, PFDT_dwBITS, PFDT_SHORT, PFDT_BYTE
       }
    PFDATATYPE;

    typedef struct _PROFILEINTS {
       UINT  offset;      
       INT   defint;      
       UINT  ids;          
       PFDATATYPE dt;
       DWORD dwDefault;
       }
    PROFILEINTS, FAR *LPPROFILEINTS;

  • EgorovAlex © (27.03.12 08:16) [1]
    Блин, ещё и в теме ошибся :)

    С PFDATATYPE всё понятно, это будет так:

    type
     PFDATATYPE = (PFDT_INT, PFDT_DWORD, PFDT_STRING, PFDT_INTARRAY, PFDT_dwBITS, PFDT_SHORT, PFDT_BYTE);

    единственный вопрос каждое значение имеет четырёхбайтовый размер?

    type
     LPROFILEINTS = ^PROFILEINTS;
     PROFILEINTS = packed record
       offset: DWORD;
       defint: Integer;
       ids:DWORD;
       dt: PFDATATYPE;
       dwDefault: DWORD;
     end;

    var
     lpProfileInts: LPROFILEINTS;

    примерно так?

    учитывая что я читаю lpProfileInts из файла, как эта переменная заполнится?
  • begin...end © (27.03.12 09:00) [2]
    > EgorovAlex ©   (27.03.12 08:16) [1]

    > единственный вопрос каждое значение имеет четырёхбайтовый размер?

    В Delphi размер переменной перечислимого типа зависит от числа его элементов и директивы компилятора $Z (она же $MINENUMSIZE). По умолчанию используется $Z1, что соответствует минимальному выделению памяти под такие переменные. Так, если число элементов меньше 256 (как у Вас), то будет выделен 1 байт, если не указано $Z2 или $Z4. В C++, насколько я помню (но не уверен), под такие переменные отводится 4 байта. Так что перед объявлением типа я бы добавил {$MINENUMSIZE 4}.

    Типы PROFILEINTS и LPROFILEINTS описаны верно.

    > учитывая что я читаю lpProfileInts из файла, как эта переменная заполнится?
    Этот вопрос неясен.
  • megavoid © (27.03.12 09:18) [3]
    А почему PROFILEINTS packed record?, там есть #pragma pack? Или они теперь все структуры packed?
  • EgorovAlex © (27.03.12 09:25) [4]
    нет, #pragma pack я не вижу, но моя переменная не сама по себе, а в другой структуре, такого вида:


    typedef struct _SD {
     BOOL  fDirect;
     UINT DriverExtra;
     LPPROFILEINTS lpProfileInts;
     UINT nProfileInts;
    }
    SD, FAR *LPSD;



    Так вот в файле BOOL занимает 4 байта
  • CRLF (27.03.12 09:37) [5]

    > нет, #pragma pack я не вижу, но моя переменная не сама по
    > себе, а в другой структуре, такого вида
    > Так вот в файле BOOL занимает 4 байта
    И какое отношение одно к другому имеет?
  • EgorovAlex © (27.03.12 09:40) [6]
    Ну это я так, для информации :), но спасибо за замечание, возможно packed лишнее
  • RWolf © (27.03.12 09:44) [7]
    BOOL и должен занимать 4 байта, в отличие от Boolean.
  • EgorovAlex © (27.03.12 09:47) [8]
    Там ещё есть одна структура, которая объявлена перед моей, в ней есть BYTE и DWORD поля, так в файле BYTE занимает 1 байт, значит packed нужен?
  • megavoid © (27.03.12 10:24) [9]
    В хакере packed объяснили с неплохим примером: http://www.xakep.ru/post/49795/
  • han_malign (27.03.12 10:44) [10]

    > В C++, насколько я помню (но не уверен), под такие переменные отводится 4 байта.

    - по умолчанию short(т.е. 2)


    > #pragma pack я не вижу

    - самое веселое, когда эта прагма вдруг проявляется в каком нибудь левом заголовочнике, закопанном на несколько уровней включения - и перед включением целевого-интерфейсного, или тупо в опциях меняется - и все накрывается медным тазом...
    Поэтому как минимум #pragma pack( show ) - должно быть всегда.


    > так в файле BYTE занимает 1 байт

    - ну дык - зависит от контекста
    {
       BYTE      b1;
       BYTE      b2;
       WORD     w1;
       DWORD    dw1;
       BYTE      b3;
       WORD     w2;
       BYTE      b4;
       DWORD    dw2;
       BYTE      b5;
       __int64  qw1;
    }


    - при включенном выравнивании:
    b1 и b2 - будут "занимать" по 1-му байту
    b3 - 2 байта
    b4 - 4 байта(/Zp4)
    b5 - страшно сказать - 8 байт(при /Zp8, /Zp16)
  • Inovet © (27.03.12 10:46) [11]
    > [2] begin...end ©   (27.03.12 09:00)
    > В C++, насколько я помню (но не уверен), под такие переменные
    > отводится 4 байта.

    Выделяется размером с int.
  • Inovet © (27.03.12 11:05) [12]
    > [10] han_malign   (27.03.12 10:44)
    > по умолчанию short(т.е. 2)

    Разве не int? Стандарта нет под рукой.
  • han_malign (27.03.12 11:16) [13]

    > Выделяется размером с int.

    - int - для x86/64 - для обратной совместимости зафиксирован на 32-битном размере:
    "Type int is an integral type that is larger than or equal to the size of type short  int, and shorter than or equal to the size of type long."
    Microsoft Specific
    int, unsigned int - 4 bytes

    Т.е., для распространенных на текущий момент платформ - может быть только 2 и 4 байта(хотя не исключены эксклюзивы на 6, 8 и 12-бит)
  • begin...end © (27.03.12 12:11) [14]
    В Windows.pas делают {$MINENUMSIZE 4}.
  • han_malign (27.03.12 12:52) [15]

    > Разве не int?

    - а ну да,  в ANSI С - enum это int...

    Попутал... - это в DCE 1.1 (RPC):
    NDR represents enumerated types as signed short integers (2 octets).
  • Anatoly Podgoretsky © (27.03.12 19:18) [16]
    Для UINT лучше использовать Longword, все таки fundamental type, в отличии от dword
 
Конференция "WinAPI" » Как это выгладит в delphi?
Есть новые Нет новых   [134431   +6][b:0][p:0.001]