Как я могу исправить это место написания о нарушении прав доступа? - PullRequest
0 голосов
/ 07 апреля 2020

Я портирую с 32 на 64 бит, и проект так далеко, что он компилируется. Но я получаю исключения, когда пытаюсь запустить программу. Я уже изменил Set/GetWindowLong with Set/GetWindowLongPtr и проверил с помощью / Wp64 предупреждения, но их слишком много (например, 3000).

Это блок кода, в котором появляется исключение:

FARPROC old_evhndl = (FARPROC)obj->old_eventhandler(); //ide shows me here the address of old_evhndl
if (!old_evhndl || !IsWindow (hwnd))
    return 0;

if ((msg==WM_MOUSEWHEEL)&&scroll_handl)
    return 0;

LRESULT lRes = CallWindowProc(old_evhndl, hwnd, msg, (WPARAM)wParam,(LPARAM) lParam); //exception points here | ide shows me here the address of old_evhndl
return lRes;

Исключение:

Exception thrown at 0x00007FF9F241D7E6 (user32.dll) in filetool.exe: 0xC0000005: Access violation writing location 0x00000000BFEFD0B0.

Старшие 32 бита этого 64-битного адреса равны нулю И, очевидно, он недопустим, поскольку обнаруживается при нарушении доступа. Таким образом, очевидно, что оно было усечено.

Реально, единственный способ, которым это происходит, - приведение указателя к 32-разрядному целочисленному типу и обратно.

Я проследил это назад, но не смог найти ничего подозрительного. Может быть, он не может обработать преобразование из old_eventhandler в FARPRO C. У old_eventhandler тип void *.

Адрес, на который мне указывает ide для old_evhndl: ntdll.dll!0x00007FF9F 403BE60. Я вижу сходство с этим адресом 0x00007FF9F E24D7E6. Вы также можете увидеть это здесь: https://imgur.com/2gCMG6b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...