runewalsh писал(а):Попробуй Math.SetExceptionMask([]).
Нет, там (в коде) всё в норме, я проверял, ноля - никогда не бывает, но SetExceptionMask всё равно потом сделаю, классная функция, спасибо.
Сегодня, установил версию 1.64 + 3.02 и сбой в этом месте на 32 - вроде перестал появляться, но на 64 - планшет сразу отрубает программу, стоит коснуться пером.
Стал рыть в этой части и нарыл, вот что:
В
WinHID.pas - объявление вот такое:
- Код: Выделить всё
pRawInput = ^RawInput;
RawInput = record
header: RawInputHeader;
case byte of
0: (mouse: RawMouse);
1: (keyboard: RawKeyboard);
2: (hid: RawHid);
end;
А в
struct.inc, уже вот такое:
- Код: Выделить всё
tagRAWINPUT = record
header: RAWINPUTHEADER;
data: record
case longint of
0: (mouse: RAWMOUSE);
1: (keyboard: RAWKEYBOARD);
2: (hid: RAWHID);
end;
end;
PRAWINPUT = ^tagRAWINPUT;
Судя по всему именно конфликты в версиях модулей, т.к. здесь и там
разные объявления, и где-то там в системе, могут быть разные обращения к raw: pRawInput;
Видимо
WinHID.pas - устарел для этой версии Лазаруса и FPC, т.к. в предыдущей версии ЭТИ проблемы - явно отсутствовали.
Добавлено спустя 24 минуты 2 секунды:В WinHID.pas - объявление вот такое:
- Код: Выделить всё
function GetRawInputData(hRawInput: Windows.HANDLE; uiCommand: Windows.UINT; pData: pointer; var pcbSize: Windows.UINT; cbSizeHeader: Windows.UINT): Windows.UINT; stdcall; external user32;
А в func.inc, немнооожечко другое:
- Код: Выделить всё
function GetRawInputData(hRawInput: HRAWINPUT; uiCommand: UINT; pData: LPVOID; pcbSize: PUINT; cbSizeHeader: UINT): UINT; external 'user32' name 'GetRawInputData';
UINT меняется на
PUINT, но при этом обращение идёт одной и той же библиотеке и функции.
Пришлось заменить объявление:
preparsedSize, rawSize: Windows.
UINT;
на
preparsedSize, rawSize: Windows.
PUINT;
Иначе не хотел компилировать. Заменил заработало.
В общем, в итоге, похоже программа ГДЕ-ТО получает вместо адреса в памяти, значение нажатия пера (или около того), т.к. в модулях чехарда с объявлениями. Ну и естественно всё рушится. (я так предполагаю).
Добавлено спустя 16 минут 42 секунды:Принудительно сделал все ссылки на модуль WinHID.pas - всё заработало на обеих версиях 32 и 64. И изначальный сбой вроде пока ещё не вылетал, но он бывает 1 раз в 15-30 минут. Так что поймать его очень сложно. Возможно теперь, всё починилось, т.к. вроде как при тестировании 32 разряда я сбой не смог получить.