Может, кто подскажет, где найти описание переменной c_dfDIKeyboard... Недавно отредактировал вручную dinput.inc для Асма, вроде бы все ОК, компилирует прогу без ошибок, исключая одну: неизвестная переменная c_dfDIKeyboard. Попробовал найти INC, где она описывается, перерыл все заголовки в Асме, DirectX и Visual C - нет ее нигде. А все учебники дают ссылку только на нее, не раскрывая структуру DIDATAFORMAT для настройки клавиатуры и мыши: используйте готовое предопределение... К сожалению, не знаю, где происходит объявление таких констант
inew Afaik Код (Text): ;; dinput.inc ... _DIDATAFORMAT STRUCT dwSize DWORD ? dwObjSize DWORD ? dwFlags DWORD ? dwDataSize DWORD ? dwNumObjs DWORD ? rgodf LPDIOBJECTDATAFORMAT ? _DIDATAFORMAT ENDS DIDATAFORMAT TYPEDEF _DIDATAFORMAT LPDIDATAFORMAT TYPEDEF PTR _DIDATAFORMAT LPCDIDATAFORMAT TYPEDEF PTR _DIDATAFORMAT EXTERNDEF C c_dfDIMouse:_DIDATAFORMAT EXTERNDEF C c_dfDIKeyboard:_DIDATAFORMAT EXTERNDEF C c_dfDIJoystick:_DIDATAFORMAT EXTERNDEF C c_dfDIJoystick2:_DIDATAFORMAT ...
c_dfDIKeyboard никак не определена в заголовках, а лежит или в dinput.lib, или dxguid.lib ... уже не помню, так как никогда не линковал этот бесполезный код, а создаю его динамически таким способом: Код (Text): #ifndef DIDFT_OPTIONAL #define DIDFT_OPTIONAL 0x80000000 #endif enum { number_of_keys = 0x100 }; static DIOBJECTDATAFORMAT key_data_format[number_of_keys]; // c_dfDIKeyboard // Создаём c_dfDIKeyboard unsigned i = 0; do { key_data_format[i].pguid = &GUID_Key; key_data_format[i].dwOfs = i; key_data_format[i].dwType = DIDFT_BUTTON | DIDFT_OPTIONAL; *((char *)&key_data_format[i].dwType+1) = (char)i; key_data_format[i].dwFlags = 0; } while( (char)++i );// number_of_keys // GUID_Key - это: 20 82 72 55 3C D3 CF 11 BF C7 44 45 53 54 00 00 static DIDATAFORMAT keyboard_format_descriptor = { sizeof(DIDATAFORMAT), sizeof(DIOBJECTDATAFORMAT), DIDF_RELAXIS, number_of_keys, number_of_keys, key_data_format }; // IDirectInputDevice7A * keyboard; // keyboard->SetDataFormat(&keyboard_format_descriptor);
S_T_A_S_ c_dfDIKeyboard никак не определена в заголовках Не правда. Код (Text): // из vc6\INCLUDE\dinput.h extern const DIDATAFORMAT c_dfDIMouse; extern const DIDATAFORMAT c_dfDIKeyboard; extern const DIDATAFORMAT c_dfDIJoystick; extern const DIDATAFORMAT c_dfDIJoystick2; // из Microsoft Visual Studio .NET\Vc7\PlatformSDK\Include\dinput.h #ifdef __cplusplus extern "C" { #endif extern const DIDATAFORMAT c_dfDIMouse; #if(DIRECTINPUT_VERSION >= 0x0700) extern const DIDATAFORMAT c_dfDIMouse2; #endif /* DIRECTINPUT_VERSION >= 0x0700 */ extern const DIDATAFORMAT c_dfDIKeyboard; #if(DIRECTINPUT_VERSION >= 0x0500) extern const DIDATAFORMAT c_dfDIJoystick; extern const DIDATAFORMAT c_dfDIJoystick2; #endif /* DIRECTINPUT_VERSION >= 0x0500 */ #ifdef __cplusplus }; #endif
q_q afaik, это объявление, а не определение. разве можно сделать выводы, что именно представляет из себя этот массив структур? Описания нет и в MSDN, я смотрел внутренности либы в hex редакторе
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."
q_q > Это ты про DIDATAFORMAT.rgodf? Да, а конкретнее - про c_dfDIKeyboard. А , не значит, же что may not create В некоторых случаях линковать 4Kb непозволительная роскошь, и в MSDN ничего не сказано, как быть в этом not typical случае.
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?
q_q > Интересная позиция Сначала утверждаешь, что информация о структуре c_dfDIKeyboard есть, но когда выясняется, что информация эта всёго лишь , говоришь, что она не нужна . > К чему этот совет? Как мы выяснили, в документации ничего толкового нет, а исходник у меня есть и свой > А разве 4К из секции неинициализированных данных будут храниться на винте?
S_T_A_S_ Давай по порядку. Сначала утверждаешь, что информация о структуре c_dfDIKeyboard есть Это правда. В msdn есть упоминание о c_dfDIKeyboard и есть описание DIOBJECTDATAFORMAT. информация ... говоришь, что она не нужна Не правда. Imho мое "не обязан" и твоя интерпретация "не нужна" не равнозначны. Мало того ты преднамеренно искажаешь смысл моих слов. К чему этот совет? Не к тому, что необходимо использовать c_dfDIKeyboard, а к тому, что есть можно посмотреть вариант ее заполнения без "смотрел внутренности либы в hex редакторе". Как мы выяснили, в документации ничего толкового нет Это твой вывод, а не наш. Мой вывод "msdn не обязан" . Imho надо иметь смелость признать свои ошибки "... c_dfDIKeyboard никак не определена в заголовках ... Описания нет и в MSDN ...", а не ловчить.
q_q Свои ошибки я с радостью признаю, потому что это значит, что я чему-то научился. Но в твоих замечаниях и не вижу чего-то кроме придирки к формулировкам и уж если на то пошло, то может быть не будем делать подмену понятий объявление и определение, описание и упоминание ? > для меня 2й вариант более выгоден, так как это одновременно сэкономило и время и деньги к тому же, позволило прямо ответить на поставленный в топе вопрос.
S_T_A_S_ в твоих замечаниях и не вижу чего-то кроме придирки к формулировкам Это не мои проблемы. Учись формулировать. позволило прямо ответить на поставленный в топе вопрос Особенно на "и мыши".
S_T_A_S_ может быть не будем делать подмену понятий Это к автору вопроса "где она описывается ... не раскрывая структуру ... где происходит объявление".
q_q > Приведи пример, что я не правильно сформулировал, моих знаний пока не достаточно, что бы найти это самому. > то, что нужно автору, я вроде понял правильно Зачем перекладывать с одной головы на другую?
S_T_A_S_ Приведи пример, что я не правильно сформулировал От Фев 28, 2005 13:09:26 Описания нет и в MSDN, я смотрел внутренности. Afaik "внутренности" - это _определение_. то, что нужно автору, я вроде понял правильно Неумеющий формулировать ответ неумеющего формулировать вопрос видит издалека.
А вот макрос для асма: Код (Text): S_BUILD_c_dfDIKeyboard MACRO .DATA ;c_dfDIKeyboard - ниже идет аналог этой структуры определенный в dxguid.lib ;DIDATAFORMAT -------------------------------------------------------------- ;dwSize dd 6*4 ; 18h ; Размер структуры в байтах ;dwObjSize dd 4*4 ; 10h ; Размер структуры DIOBJECTDATAFORMAT ;dwFlags dd DIDF_RELAXIS ; или DIDF_ABSAXIS ;dwDataSize dd 256 ; Размер пересылаемых данных в байтах ;dwNumObjs dd 256 ; Число объектов в массиве rgodf ;rgodf dd OFFSET l@pguid ; Адрес массива состоящего из структур DIOBJECTDATAFORMAT c_dfDIKeyboard_alt dd 6*4, 4*4, DIDF_RELAXIS, 256, 256, OFFSET l@pguid guid_ GUID GUID_Key .DATA? ;DIOBJECTDATAFORMAT ------------------------------------------------------- l@pguid dd 256*4 DUP (?) .CODE lea esi, guid_ lea edi, l@pguid mov ebx, 8000000Ch xor eax, eax mov edx, eax inc ah push eax dec ah pop ecx @@: mov DWORD PTR [edi], esi mov DWORD PTR [edi+4], eax mov DWORD PTR [edi+8], ebx mov DWORD PTR [edi+12], edx inc eax add ebx, 256 add edi, 16 loop @B ENDM