Я портирую с 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