Переключение на Главную Страницу Страницы: 1 2 [3]  ОтправитьПечать
Очень популярная тема (более 25 ответов) xp embedded + citix + formex = вылет (число прочтений - 14323 )
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: xp embedded + citix + formex = вылет
Ответ #30 - 16. Ноября 2010 :: 15:38
Печать  
Все... Я пас... Могу только предложить сборку, где этот код вообще отключен. Не будет работать установка вида курсора.
  

fe_test_017.zip ( 238 KB | Загрузки )

FormEx developer
Наверх
www  
IP записан
 
Zhenya
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 37
Зарегистрирован: 18. Октября 2010
Пол: Женский
Re: xp embedded + citix + formex = вылет
Ответ #31 - 17. Ноября 2010 :: 07:05
Печать  
Ну пусть будет так, я всё равно не пользуюсь этой возможностью. Главное что теперь всё работает и в WinCE и в WinXPEm
  
Наверх
 
IP записан
 
mehfk
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 22. Августа 2011
Re: xp embedded + citix + formex = вылет
Ответ #32 - 06. Сентября 2011 :: 06:34
Печать  
Доброго времени суток всем!
Столкнулся с данной проблемой, причем перепробовал разные версии 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
  
Наверх
 
IP записан
 
mehfk
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 22. Августа 2011
Re: xp embedded + citix + formex = вылет
Ответ #33 - 06. Сентября 2011 :: 06:38
Печать  
Клиент используется цитриксовский под linux
Аналогичный код используется еще в нескольких местах, но я исправил только в одном месте.
Надеюсь, АЛьФ исправит данную ошибку.
Если АЛьФ не возражает, могу здесь выложить полученную в результате опытов библиотеку.
Спасибо.
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: xp embedded + citix + formex = вылет
Ответ #34 - 06. Сентября 2011 :: 08:54
Печать  
Сейчас попробую подправить.
  

FormEx developer
Наверх
www  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: xp embedded + citix + formex = вылет
Ответ #35 - 06. Сентября 2011 :: 09:11
Печать  
Тестируем...
  

FormEx.zip ( 231 KB | Загрузки )

FormEx developer
Наверх
www  
IP записан
 
mehfk
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 22. Августа 2011
Re: xp embedded + citix + formex = вылет
Ответ #36 - 06. Сентября 2011 :: 09:23
Печать  
Тестовая конфа запускается. В окне "Помощь->О программе" вкладки нет.
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: xp embedded + citix + formex = вылет
Ответ #37 - 06. Сентября 2011 :: 09:46
Печать  
mehfk писал(а) 06. Сентября 2011 :: 09:23:
Тестовая конфа запускается. В окне "Помощь->О программе" вкладки нет.


Эм... Это я отрубал по просьбе это окно, а вернуть забыл. Надеюсь, не критично его наличие?
  

FormEx developer
Наверх
www  
IP записан
 
mehfk
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 16
Зарегистрирован: 22. Августа 2011
Re: xp embedded + citix + formex = вылет
Ответ #38 - 06. Сентября 2011 :: 10:03
Печать  
В приницпе не критично. Измененный код войдет в стабильный релиз?
  
Наверх
 
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: xp embedded + citix + formex = вылет
Ответ #39 - 06. Сентября 2011 :: 10:09
Печать  
mehfk писал(а) 06. Сентября 2011 :: 10:03:
В приницпе не критично. Измененный код войдет в стабильный релиз?


Я сейчас практически не занимаюсь FormEx. Только по таким вот запросам мелочи правлю. Так что "стабильный релиз" - это из прошедших уже времен...
  

FormEx developer
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 
ОтправитьПечать