Не получается инициализировать DirectInput. Помогите, пожалуйста, очень надо. Код (Text): .DATA ;interfaces ----------------------------------------------------- POINTER_INTERFACE_DIRECTINPUT8 DWORD ? INTERFACE_DIRECTINPUT8 STRUCT QueryInterface DWORD 00000000h AddRef DWORD 00000004h Release DWORD 00000008h CreateDevice DWORD 0000000Ch EnumDevices DWORD 00000010h GetDeviceStatus DWORD 00000014h RunControlPanel DWORD 00000018h Initialize DWORD 0000001Ch FindDevice DWORD 00000020h EnumDevicesBySemantics DWORD 00000024h ConfigureDevices DWORD 00000028h INTERFACE_DIRECTINPUT8 ENDS POINTER_INTERFACE_DIRECTINPUTDEVICE8 DWORD ? INTERFACE_DIRECTINPUTDEVICE8 STRUCT QueryInterface DWORD 00000000h AddRef DWORD 00000004h Release DWORD 00000008h GetCapabilities DWORD 0000000Ch EnumObjects DWORD 00000010h GetProperty DWORD 00000014h SetProperty DWORD 00000018h Acquire DWORD 0000001Ch Unacquire DWORD 00000020h GetDeviceState DWORD 00000024h GetDeviceData DWORD 00000028h SetDataFormat DWORD 0000002Ch INTERFACE_DIRECTINPUTDEVICE8 ENDS ;structures ----------------------------------------------------- DIRECTINPUT_DATAFORMAT STRUCT dwSize DWORD ? dwObjSize DWORD ? dwFlags DWORD ? dwDataSize DWORD ? dwNumObjs DWORD ? rgodf DWORD ? DIRECTINPUT_DATAFORMAT ENDS GUID_Key GUID <055728220h, 0D33Ch, 11CFh, <0BFh, 0C7h, 44h, 45h, 053h, 54h, 00h, 00h>> IID_IDIRECTINPUT8 GUID <0BF798030h, 0483Ah, 4DA2h, <0AAh, 099h, 5Dh, 64h, 0EDh, 36h, 97h, 00h>> GUID_SYSKEYBOARD GUID <06F1D2B61h, 0D5A0h, 11CFh, <0BFh, 0C7h, 44h, 45h, 053h, 54h, 00h, 00h>> _DIOBJECTDATAFORMAT STRUCT pguid DWORD ? dwOfs DWORD ? dwType DWORD ? dwFlags DWORD ? _DIOBJECTDATAFORMAT ENDS _DIKEYBOARD _DIOBJECTDATAFORMAT 256 DUP (<?>) _DIDATAFORMAT STRUCT dwSize DWORD 24 ;size of _DIDATAFORMAT dwObjSize DWORD 16 ;size of _DIOBJECTDATAFORMAT dwFlags DWORD 00000002h ;DIDF_RELAXIS dwDataSize DWORD 256 dwNumObjs DWORD 256 rgodf DWORD OFFSET _DIKEYBOARD _DIDATAFORMAT ENDS .CODE ;get DIRECTINPUT8 interface PUSH 0 PUSH OFFSET POINTER_INTERFACE_DIRECTINPUT8 PUSH OFFSET IID_IDIRECTINPUT8 PUSH 0800h ;DIRECTINPUT_VERSION PUSH WINDOW_CLASS.hInstance CALL ADDR_DirectInput8Create ;get DIRECTINPUTDEVICE8 interface PUSH 0 PUSH OFFSET POINTER_INTERFACE_DIRECTINPUTDEVICE8 PUSH OFFSET GUID_SYSKEYBOARD MOV EAX, POINTER_INTERFACE_DIRECTINPUT8 PUSH EAX MOV EAX, [EAX] CALL DWORD PTR [EAX + INTERFACE_DIRECTINPUT8.CreateDevice] ;fill _DIKEYBOARD MOV ESI, OFFSET _DIKEYBOARD + 4096 ;256 * 16 MOV ECX, 255 FILL_NEXT_ELEMENT: SUB ESI, 4h MOV EAX, 0h MOV [ESI], EAX SUB ESI, 4h MOV EBX, ECX SHL EBX, 8 OR EBX, 8000000Ch MOV [ESI], EBX SUB ESI, 4h MOV [ESI], ECX SUB ESI, 4h MOV [ESI], OFFSET GUID_Key LOOP FILL_NEXT_ELEMENT ;set data format PUSH OFFSET _DIDATAFORMAT MOV EAX, POINTER_INTERFACE_DIRECTINPUTDEVICE8 PUSH EAX MOV EAX, [EAX] error >>> CALL DWORD PTR [EAX + INTERFACE_DIRECTINPUTDEVICE8.SetDataFormat] Почему возникает ошибка? Подскажите, добрые люди!
Структуру _DIKEYBOARD правильно заполняешь? Посмотри как заполняли здесь http://www.wasm.ru/forum/viewtopic.php?id=8941 Остальные структуры, GUID'ы и вызовы методов вроде бы верные...
Чтобы не быть голословным, прикрепляю рабочий пример выдранный из моего пакета инклудов к DX8. Просто создавать примерчик и втыкать в него кусок твоего кода, нет времени, думаю исходник поможет.
Я сейчас вставил твой код в приаттаченный пример (в пятом посте), и могу совершенно однозначно сказать, структуру ты заполняешь неверно. Весь код кроме заполнения структуры работает на ура. Возьми нормальное заполнение и не мучайся.
а все либы и инклуды лежат в аттаче кроме dinput8.lib и dinput8.inc там ничего кроме стандартных либ и инклудов masm'a не используется... Просто видимо не смотрел и не пытался, ну в таком случае уже ничем помочь не могу
У меня нет стандартных либов и инклудов. Просто линкер и компилятор. Нет ни kernel32.inc ни windows.inc и с либами такая же дрянь может подскажешь, где полную версию компилятора можно взять(или ещё лучше приаттач в мессадж), а то у меня компилятор из книги. Увожаемый KeYMax я глубоко увожаю ваши советы. Огромное спасибо вам и я очень рад, что в России есть такие умные люди. Врать вам и перекладывать работу на ваши плечи, мыслей не было.
Весь пакет masm самой последней версии (MASM32 v9) есть на этом же сайте в разделе "Инструменты->компиляторы" здесь Без него просто никак Установка проблем вызвать не должна, там install
Добрый вечер увожаемый KeYMax! Огромное спасибо за ссылочки. Теперь структура заполнилась нормально, ошибок в инициализации нет. Но при чтении клавиатуры(DIRECTINPUT_READKEYBOARD.INC - там считывание DIK_UPARROW) программа завершается аварийно. Почему? Зарание благодарен.
Первое что сразу бросается в глаза это то, что программа собирается линкером как консольная, хотя в тексте программы явно встречаются создание окна и оконная процедура... зачем? На этой строчке при любой нажатой клавише явно завершается работа приложения: .IF LOCALMSG == 00000100h ;WM_KEYDOWN <------- !!!! и от directinput это никак не зависит, так как это событие о нажатии любой клавиши приходит в оконную процедуру. Можно например эту строку оставить и дополнительно проверять какую клавишу нажали (Esc например) и только после этого завершать работу...
Ха-ха-ха! Огромное спосибо KeYMax что подсказал! Как я мог пропустить такую мелочь... видимо увлёкся тестами DirectInput, а про окно забыл. В консоль мне удобнее ошибки выводить. Вот, глянь что получилось. Тут конечно ещё далеко до совершенства, но всё-же.
Добрый вечер! Подскажите, пожалуйста, как заPUSHить дробное число в качестве параметра функции. Есть функция: Код (Text): function ADD_REAL(A, B: EXTENDED): EXTENDED; begin RESULT := A + B; end; Как правильно её вызвать: Код (Text): PUSH 2.5 ?\как правильно заPUSHить PUSH 2.5 ?/ CALL ADD_REAL
Самый простой вариант для masm'a это объявить переменную в секции .data а затем заталкивать ее в стек. Или можно воспользоваться макросом fpc Код (Text): ;***************************************************************************** ; Данный макрос позволяет указывать непосредственно в коде числа с плавающей ; запятой. ; fpc macro allows constants to be used with floating point operations. ; Authored by bitRAKE from Win32ASM board <http://board.win32asmcommunity.net> ; Great resource for assembler hackers ;***************************************************************************** fpc MACRO val:REQ LOCAL w,x,y,z,zz,ww ;; split type and value, defaulting to REAL4 z INSTR 1,<&val>,<! > IF z EQ 0 y TEXTEQU <REAL4> x TEXTEQU <&val> ELSE y TEXTEQU @SubStr(<&val>,1,z-1) ;; Type x TEXTEQU @SubStr(<&val>,z+1,) ;; Value ENDIF ;; replace . with _ z INSTR 1,x,<!.> IF z EQ 0 w TEXTEQU x x CATSTR x,<.0> ;; prevent error message ELSE w CATSTR @SubStr(%x,1,z-1),<_>,@SubStr(%x,z+1,) ENDIF ;; replace - with _ zz INSTR 1,w,<!-> IF zz EQ 0 ww TEXTEQU w ELSE ww CATSTR @SubStr(%w,1,zz-1),<_>,@SubStr(%w,zz+1,) ENDIF ;; figure out global name for constant z SIZESTR y ;; use last char for size distiction ww CATSTR <__>,ww,<r>,@SubStr(%y,z,1) IF (OPATTR(ww)) EQ 0 ;; not defined CONST SEGMENT ww y x CONST ENDS ENDIF EXITM ww ENDM FP4 MACRO value EXITM fpc( @CatStr( <REAL4 >,value ) ) ENDM FP8 MACRO value EXITM fpc( @CatStr( <REAL8 >,value ) ) ENDM FP10 MACRO value EXITM fpc( @CatStr( <REAL10 >,value ) ) ENDM используется так: invoke somefunc, fpc(0.05f), fpc(1.5f) А вот для fasm'a такой проблемы не существует, там можно прямо в invoke указывать числа с плавающей запятой.
Здравствуйте, Михаил-KeYMax! У меня возникла проблема: почему-то не движется камера... операции с матрицами вроде-бы верные (DIRECT3D_RENDERSCREEN.INC) при нажатии uparrow, прирост не приростает может я не правильно использую функции FPU (DIRECTINPUT_READDEVICE.INC)?