DirectInput SetDataFormat + 64 бита (+ Delphi) - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь инициализировать 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, но он слишком негибкий и недельный для моих целей.

...