Доброго времени суток всем! Столкнулся с данной проблемой, причем перепробовал разные версии 1с++ и formex и их комбинации (вплоть до ранней 1.8.1.6). Ошибка, похоже, тянется из ранних версий. В версии, которая выложена в топике (с отключенной установкой курсоров), вылет не происходит.
Установка оконной функции происходит здесь (из исходников 1С++версии 2.0.3.7)
hMainWndProc = ::GetWindowLong(pMainWindow->GetSafeHwnd(),GWL_WNDPROC); ::SetWindowLong(pMainWindow->GetSafeHwnd(),GWL_WNDPROC,(LONG)newMainWndProc);
На самом деле вылет происходит в оконной функции.
LRESULT CALLBACK newMainWndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam) { if(nMessage == WM_SETCURSOR) { if(FormEx_OnSetCursor(LOWORD(lParam))) return 1; } return ((WNDPROC)hMainWndProc)(hWnd, nMessage, wParam, lParam); }
Возьму на себя смелость заметить, что вот этот вызов не совсем корректен return ((WNDPROC)hMainWndProc)(hWnd, nMessage, wParam, lParam); согласно MSDN пользоваться в данном случае необходимо функцией CallWindowProc, т.е. в конечном итоге должно получиться что-то вроде return CallWindowProc((WNDPROC)hMainWndProc, hWnd, nMessage, wParam, lParam);
Для проверки своих мыслей сделал следующее: отредактировал таблицу импорта - добавил функцию CallWindowProcA далее взял hiew и немного переписал данную функцию
исходный вариант выглядит так
.text:1FA29C50 sub_1FA29C50 proc near ; DATA XREF: sub_1FA2A000:loc_1FA2A34D o .text:1FA29C50 .text:1FA29C50 arg_0 = dword ptr 4 .text:1FA29C50 arg_4 = dword ptr 8 .text:1FA29C50 arg_8 = dword ptr 0Ch .text:1FA29C50 arg_C = dword ptr 10h .text:1FA29C50 .text:1FA29C50 push esi .text:1FA29C51 mov esi, [esp+4+arg_4] .text:1FA29C55 push edi .text:1FA29C56 mov edi, [esp+8+arg_C] .text:1FA29C5A cmp esi, 20h .text:1FA29C5D jnz short loc_1FA29C76 .text:1FA29C5F push edi .text:1FA29C60 call sub_1FA29800 .text:1FA29C65 add esp, 4 .text:1FA29C68 test eax, eax .text:1FA29C6A jz short loc_1FA29C76 .text:1FA29C6C pop edi .text:1FA29C6D mov eax, 1 .text:1FA29C72 pop esi .text:1FA29C73 retn 10h .text:1FA29C76 ; --------------------------------------------------------------------------- .text:1FA29C76 .text:1FA29C76 loc_1FA29C76: ; CODE XREF: sub_1FA29C50+D j .text:1FA29C76 ; sub_1FA29C50+1A j .text:1FA29C76 mov eax, [esp+8+arg_8] .text:1FA29C7A mov ecx, [esp+8+arg_0] .text:1FA29C7E push edi .text:1FA29C7F push eax .text:1FA29C80 push esi .text:1FA29C81 push ecx .text:1FA29C82 call dword_1FA7BBD4 .text:1FA29C88 pop edi .text:1FA29C89 pop esi .text:1FA29C8A retn 10h .text:1FA29C8A sub_1FA29C50 endp
С учетом вышесказанного, сделал так
.text:1FA29C50 sub_1FA29C50 proc near ; DATA XREF: sub_1FA2A000:loc_1FA2A34D o .text:1FA29C50 .text:1FA29C50 hWnd = dword ptr 4 .text:1FA29C50 Msg = dword ptr 8 .text:1FA29C50 wParam = dword ptr 0Ch .text:1FA29C50 lParam = dword ptr 10h .text:1FA29C50 .text:1FA29C50 push esi .text:1FA29C51 mov esi, [esp+4+Msg] .text:1FA29C55 push edi .text:1FA29C56 mov edi, [esp+8+lParam] .text:1FA29C5A cmp esi, 20h .text:1FA29C5D jnz short loc_1FA29C71 .text:1FA29C5F push edi .text:1FA29C60 call sub_1FA29800 .text:1FA29C65 add esp, 4 .text:1FA29C68 test eax, eax .text:1FA29C6A jz short loc_1FA29C71 .text:1FA29C6C xor eax, eax .text:1FA29C6E inc eax .text:1FA29C6F jmp short loc_1FA29C89 .text:1FA29C71 ; --------------------------------------------------------------------------- .text:1FA29C71 .text:1FA29C71 loc_1FA29C71: ; CODE XREF: sub_1FA29C50+D j .text:1FA29C71 ; sub_1FA29C50+1A j .text:1FA29C71 mov eax, [esp+8+wParam] .text:1FA29C75 mov ecx, [esp+8+hWnd] .text:1FA29C79 push edi ; lParam .text:1FA29C7A push eax ; wParam .text:1FA29C7B push esi ; Msg .text:1FA29C7C push ecx ; hWnd .text:1FA29C7D mov eax, lpPrevWndFunc .text:1FA29C82 push eax ; lpPrevWndFunc .text:1FA29C83 call ds:CallWindowProcA .text:1FA29C89 .text:1FA29C89 loc_1FA29C89: ; CODE XREF: sub_1FA29C50+1F j .text:1FA29C89 pop edi .text:1FA29C8A pop esi .text:1FA29C8B retn 10h .text:1FA29C8B sub_1FA29C50 endp
|