Константы c_dfDIKeyboard, c_dfDIMouse

Тема в разделе "WASM.DirectX", создана пользователем inew, 28 фев 2005.

  1. inew

    inew New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2004
    Сообщения:
    26
    Может, кто подскажет, где найти описание переменной c_dfDIKeyboard...

    Недавно отредактировал вручную dinput.inc для Асма, вроде бы все ОК, компилирует прогу без ошибок, исключая одну: неизвестная переменная c_dfDIKeyboard. Попробовал найти INC, где она описывается, перерыл все заголовки в Асме, DirectX и Visual C - нет ее нигде. А все учебники дают ссылку только на нее, не раскрывая структуру DIDATAFORMAT для настройки клавиатуры и мыши: используйте готовое предопределение...

    К сожалению, не знаю, где происходит объявление таких констант
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    inew

    Ты что, издеваешься? Зачем стольно тем насоздавал?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    inew

    Afaik
    Код (Text):
    1. ;; dinput.inc
    2. ...
    3. _DIDATAFORMAT   STRUCT
    4. dwSize      DWORD       ?
    5. dwObjSize   DWORD       ?
    6. dwFlags     DWORD       ?
    7. dwDataSize  DWORD       ?
    8. dwNumObjs   DWORD       ?
    9. rgodf       LPDIOBJECTDATAFORMAT        ?
    10. _DIDATAFORMAT   ENDS
    11.  
    12. DIDATAFORMAT        TYPEDEF     _DIDATAFORMAT
    13. LPDIDATAFORMAT      TYPEDEF     PTR _DIDATAFORMAT
    14. LPCDIDATAFORMAT     TYPEDEF     PTR _DIDATAFORMAT
    15.  
    16. EXTERNDEF   C c_dfDIMouse:_DIDATAFORMAT
    17. EXTERNDEF   C c_dfDIKeyboard:_DIDATAFORMAT
    18. EXTERNDEF   C c_dfDIJoystick:_DIDATAFORMAT
    19. EXTERNDEF   C c_dfDIJoystick2:_DIDATAFORMAT
    20. ...
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    c_dfDIKeyboard никак не определена в заголовках, а лежит или в dinput.lib, или dxguid.lib ... уже не помню, так как никогда не линковал этот бесполезный код, а создаю его динамически таким способом:
    Код (Text):
    1.  
    2. #ifndef DIDFT_OPTIONAL
    3. #define DIDFT_OPTIONAL      0x80000000
    4. #endif
    5.  
    6.     enum    {   number_of_keys  = 0x100 };
    7.     static DIOBJECTDATAFORMAT       key_data_format[number_of_keys]; // c_dfDIKeyboard
    8.  
    9.     // Создаём c_dfDIKeyboard
    10.     unsigned i = 0;    do
    11.     {
    12.         key_data_format[i].pguid   = &GUID_Key;
    13.         key_data_format[i].dwOfs   = i;
    14.         key_data_format[i].dwType  = DIDFT_BUTTON | DIDFT_OPTIONAL;
    15.         *((char *)&key_data_format[i].dwType+1) = (char)i;        
    16.         key_data_format[i].dwFlags = 0;
    17.     }
    18.     while( (char)++i );// number_of_keys
    19.  
    20. // GUID_Key - это: 20 82 72 55 3C D3 CF 11 BF C7 44 45 53 54 00 00
    21.  
    22. static  DIDATAFORMAT            keyboard_format_descriptor =
    23. {
    24.     sizeof(DIDATAFORMAT),
    25.     sizeof(DIOBJECTDATAFORMAT),
    26.     DIDF_RELAXIS,
    27.     number_of_keys,
    28.     number_of_keys,
    29.     key_data_format
    30. };
    31.  
    32. //
    33.     IDirectInputDevice7A   * keyboard;
    34. //
    35.     keyboard->SetDataFormat(&keyboard_format_descriptor);
    36.  
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_T_A_S_

    c_dfDIKeyboard никак не определена в заголовках

    Не правда.
    Код (Text):
    1. // из vc6\INCLUDE\dinput.h
    2. extern const DIDATAFORMAT c_dfDIMouse;
    3. extern const DIDATAFORMAT c_dfDIKeyboard;
    4. extern const DIDATAFORMAT c_dfDIJoystick;
    5. extern const DIDATAFORMAT c_dfDIJoystick2;
    6.  
    7.  
    8. // из Microsoft Visual Studio .NET\Vc7\PlatformSDK\Include\dinput.h
    9. #ifdef __cplusplus
    10. extern "C" {
    11. #endif
    12. extern const DIDATAFORMAT c_dfDIMouse;
    13.  
    14. #if(DIRECTINPUT_VERSION >= 0x0700)
    15. extern const DIDATAFORMAT c_dfDIMouse2;
    16. #endif /* DIRECTINPUT_VERSION >= 0x0700 */
    17.  
    18. extern const DIDATAFORMAT c_dfDIKeyboard;
    19.  
    20. #if(DIRECTINPUT_VERSION >= 0x0500)
    21. extern const DIDATAFORMAT c_dfDIJoystick;
    22. extern const DIDATAFORMAT c_dfDIJoystick2;
    23. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
    24.  
    25. #ifdef __cplusplus
    26. };
    27. #endif
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    q_q



    afaik, это объявление, а не определение. разве можно сделать выводы, что именно представляет из себя этот массив структур?

    Описания нет и в MSDN, я смотрел внутренности либы в hex редакторе :)
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_T_A_S_

    что именно представляет из себя этот массив структур

    Это ты про DIDATAFORMAT.rgodf?



    Описания нет и в MSDN

    Не правда. The DirectX Software Development Kit -> DirectX Input -> DirectInput C/C++ Reference -> Structures -> DIDATAFORMAT или DIOBJECTDATAFORMAT.



    В предпоследней ссылке есть "Applications do not typically need to create a DIDATAFORMAT structure. An application can use one of the predefined global data format variables, c_dfDIMouse, c_dfDIMouse2, c_dfDIKeyboard, c_dfDIJoystick, or c_dfDIJoystick2."
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    q_q > Это ты про DIDATAFORMAT.rgodf?



    Да, а конкретнее - про c_dfDIKeyboard.



    А
    , не значит, же что may not create ;)

    В некоторых случаях линковать 4Kb непозволительная роскошь, и в MSDN ничего не сказано, как быть в этом not typical случае.
     
  9. inew

    inew New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2004
    Сообщения:
    26
    S_T_A_S_ Спасиба ! Как всегда, выручил..
     
  10. inew

    inew New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2004
    Сообщения:
    26
    IceStudent

    Извини, просто тупанул. Думал, инет завис. Ан нет!
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_T_A_S_

    и в MSDN ничего не сказано

    Imho msdn не обязан приводить примеры на все not typical case. Есть документация, читай, если не достаточно, то в сети полно исходных текcтов, например, DINPUT.C, Author: Daniel Guerrero Miralles, которые заполнят пробелы msdn.



    В некоторых случаях линковать 4Kb непозволительная роскошь

    Ты хочешь сказать, что твой static DIOBJECTDATAFORMAT key_data_format[number_of_keys] + код его заполнения, займут меньше чем c_dfDIKeyboard?
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    q_q >




    Интересная позиция ;) Сначала утверждаешь, что информация о структуре c_dfDIKeyboard есть, но когда выясняется, что информация эта всёго лишь
    , говоришь, что она не нужна :).



    >




    К чему этот совет? Как мы выяснили, в документации ничего толкового нет, а исходник у меня есть и свой ;)



    >




    А разве 4К из секции неинициализированных данных будут храниться на винте?
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_T_A_S_

    Давай по порядку.



    Сначала утверждаешь, что информация о структуре c_dfDIKeyboard есть

    Это правда.

    В msdn есть упоминание о c_dfDIKeyboard и есть описание DIOBJECTDATAFORMAT.



    информация ... говоришь, что она не нужна

    Не правда.

    Imho мое "не обязан" и твоя интерпретация "не нужна" не равнозначны. Мало того ты преднамеренно искажаешь смысл моих слов.



    К чему этот совет?

    Не к тому, что необходимо использовать c_dfDIKeyboard, а к тому, что есть можно посмотреть вариант ее заполнения без "смотрел внутренности либы в hex редакторе".



    Как мы выяснили, в документации ничего толкового нет

    Это твой вывод, а не наш. Мой вывод "msdn не обязан" .



    Imho надо иметь смелость признать свои ошибки "... c_dfDIKeyboard никак не определена в заголовках ... Описания нет и в MSDN ...", а не ловчить.
     
  14. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    q_q

    Свои ошибки я с радостью признаю, потому что это значит, что я чему-то научился.

    Но в твоих замечаниях и не вижу чего-то кроме придирки к формулировкам ;)

    и уж если на то пошло, то может быть не будем делать подмену понятий объявление и определение, описание и упоминание ?



    >




    для меня 2й вариант более выгоден, так как это одновременно сэкономило и время и деньги ;)

    к тому же, позволило прямо ответить на поставленный в топе вопрос.
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_T_A_S_

    в твоих замечаниях и не вижу чего-то кроме придирки к формулировкам

    Это не мои проблемы. Учись формулировать.



    позволило прямо ответить на поставленный в топе вопрос

    Особенно на "и мыши".
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_T_A_S_

    может быть не будем делать подмену понятий

    Это к автору вопроса "где она описывается ... не раскрывая структуру ... где происходит объявление".
     
  17. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    q_q >




    Приведи пример, что я не правильно сформулировал, моих знаний пока не достаточно, что бы найти это самому.



    >




    то, что нужно автору, я вроде понял правильно ;)

    Зачем перекладывать с одной головы на другую?
     
  18. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    S_T_A_S_

    Приведи пример, что я не правильно сформулировал

    От Фев 28, 2005 13:09:26 Описания нет и в MSDN, я смотрел внутренности. Afaik "внутренности" - это _определение_.



    то, что нужно автору, я вроде понял правильно

    Неумеющий формулировать ответ неумеющего формулировать вопрос видит издалека.
     
  19. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    [offtop deleted]
     
  20. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    А вот макрос для асма:


    Код (Text):
    1.  
    2. S_BUILD_c_dfDIKeyboard   MACRO
    3.  
    4.   .DATA
    5.  
    6.   ;c_dfDIKeyboard - ниже идет аналог этой структуры определенный в dxguid.lib
    7.   ;DIDATAFORMAT --------------------------------------------------------------
    8.    ;dwSize              dd  6*4 ; 18h                                       ; Размер структуры в байтах
    9.    ;dwObjSize           dd  4*4 ; 10h                                       ; Размер структуры DIOBJECTDATAFORMAT    
    10.    ;dwFlags             dd  DIDF_RELAXIS                                    ; или DIDF_ABSAXIS
    11.    ;dwDataSize          dd  256                                             ; Размер пересылаемых данных в байтах  
    12.    ;dwNumObjs           dd  256                                             ; Число объектов в массиве rgodf
    13.    ;rgodf               dd  OFFSET l@pguid                                  ; Адрес массива состоящего из структур DIOBJECTDATAFORMAT
    14.  
    15.    c_dfDIKeyboard_alt   dd  6*4, 4*4, DIDF_RELAXIS, 256, 256, OFFSET l@pguid  
    16.    guid_                GUID   GUID_Key
    17.  
    18.   .DATA?
    19.  
    20.    ;DIOBJECTDATAFORMAT -------------------------------------------------------      
    21.    l@pguid              dd  256*4 DUP (?)  
    22.  
    23.   .CODE
    24.  
    25.    lea     esi, guid_
    26.    lea     edi, l@pguid
    27.    mov     ebx, 8000000Ch
    28.    xor     eax, eax
    29.    mov     edx, eax
    30.    inc     ah
    31.    push    eax
    32.    dec     ah
    33.    pop     ecx
    34.    @@:
    35.    mov     DWORD PTR [edi], esi
    36.    mov     DWORD PTR [edi+4], eax
    37.    mov     DWORD PTR [edi+8], ebx
    38.    mov     DWORD PTR [edi+12], edx
    39.    inc     eax
    40.    add     ebx, 256
    41.    add     edi, 16  
    42.    loop    @B
    43.      
    44.   ENDM
    45.