Я пытаюсь инициализировать DirectInput в Delphi на 64-битной. На 32 битах работает отлично.
Пока мой код:
errorcode := DirectInput8Create(HInstance, DIRECTINPUT_VERSION, IID_IDirectInput8A, FInterface, nil);
Checkerror(errorcode, 'Creating Input');
errorcode := FInterface.CreateDevice(GUID_SysKeyboard, FKeyBoard, nil);
Checkerror(errorcode, 'Creating Keyboard');
errorcode := FKeyboard.SetCooperativeLevel(_handle, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND);
Checkerror(errorcode, 'Set Keyboard Cooperative Level');
errorcode := FKeyboard.SetDataFormat(@c_dfDIKeyboard);
Checkerror(errorcode, 'Set Keyboard Data Format');
Когда я запускаю свое приложение на 64-битной версии, DLL загружается правильно, и первые три команды DirectInput8Create, CreateDevice и SetCooperativeLevel выдают код ошибки «ОК». Но затем SetDataFormat приводит к «E_INVALIDARG».
Конечно, я также проверил его с заявленным и инициализированным форматом данных:
var
KeyboardObjects: array[0..255] of TDIObjectDataFormat;
Keyboarddataformat: TDIDataFormat;
procedure Init_KeyboardObjects;
var
i: Byte;
begin
for i := 0 to 255 do
with KeyboardObjects[i] do
begin
pGuid := @GUID_Key;
dwOfs := i;
dwFlags := 0;
dwType := $80000000 or DIDFT_BUTTON or i shl 8;
end;
end;
procedure Init_KeyboardDataFormat;
begin
Keyboarddataformat.dwSize := SizeOf(Keyboarddataformat);
Keyboarddataformat.dwObjSize := SizeOf(TDIObjectDataFormat);
Keyboarddataformat.dwFlags := DIDF_RELAXIS;
Keyboarddataformat.dwDataSize := SizeOf(TDIKeyboardState);
Keyboarddataformat.dwNumObjs := High(KeyboardObjects) + 1;
Keyboarddataformat.rgodf := @KeyboardObjects[Low(KeyboardObjects)];
end;
initialization
Init_KeyboardObjects;
Init_KeyboardDataFormat;
с
errorcode := FKeyboard.SetDataFormat(@Keyboarddataformat);
Этот «ручной» метод работает и на 32-битных системах, поэтому, похоже, он в порядке. Но он не работает и на 64 битах.
К сожалению, я не нашел никакой подсказки об этой проблеме ...: - /
Возможно, у кого-то есть крошечная идея ...?
...
Это объявление функции в заголовочном файле Delphi DirectInput:
IDirectInputDevice8A = interface (IUnknown)
['{54D41080-DC15-4833-A41B-748F73A38179}']
...
function SetDataFormat(lpdf : PDIDataFormat) : HResult; stdcall;
...
...
Я знаю, DirectInput старый, новый стандарт - XInput, но он слишком негибкий и недельный для моих целей.