Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Сервис::ВыполнитьПроцедуру - ошибка (число прочтений - 10351 )
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #15 - 06. Февраля 2007 :: 16:18
Печать  
fez писал(а) 06. Февраля 2007 :: 16:16:
При этом по ошибке управление перехватами по умолчанию включалось.

Исправлено. Т.е. в базе, в которой ни разу не загружали 1С++ версии 2.5, перехват событий будет выключен.

Но конфликт при включенном перехвате в 1С++ и ФормЕкс пока еще не исправлен.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #16 - 06. Февраля 2007 :: 17:08
Печать  
Цитата:
Исключение возникает в 1С++ в процедуре перехвата метода CBLModule::GetProcInfo().

Алексей, помоги, здесь что-то странное.
В исходниках ФормЕкс есть код Service.cpp
Код
Выбрать все
	case methCallAsProcedure:
...
//дальше код на ассемблере из отладчика
1923:		     {
1924:			   //CBLProcInfo * pProcInfo; // заменил твой код
1925:			   //pProcInfo = new CBLProcInfo(); // но с ним тоже самое :(
1926:			   CBLProcInfo ProcInfo;// если не использовать new
1FA3088C   push	  0Ch
1FA3088E   call	  CWnd::ModifyStyleEx+4 (1fa51cb2)
1FA30893   add	   esp,4
1FA30896   mov	   dword ptr [ebp-12E80h],eax
1FA3089C   mov	   ecx,dword ptr [ebp-12E80h]
1FA308A2   mov	   dword ptr [ebp-125E0h],ecx
1FA308A8   mov	   byte ptr [ebp-4],5Bh
1FA308AC   cmp	   dword ptr [ebp-125E0h],0
1FA308B3   je	    $L154228+16Ah (1fa308d5) // !!!!!!
1FA308B5   mov	   ecx,dword ptr [ebp-125E0h]
1FA308BB   call	  dword ptr [__imp_??0CBLProcInfo@@QAE@XZ (1fa57020)] // конструктор CBLProcInfo
 


Почему-то до конструктора (последняя строка) дело никогда не доходит Печаль
адрес структуры возвращается NULL и дальше на моем коде валится Печаль

А что этот ассемблерный код делает, понять не могу Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #17 - 06. Февраля 2007 :: 17:44
Печать  
Чой-то у тебя ассемблерный код не соответствует СИшному незаремаренному. Такой код получается именно при использовании new.
У меня и с new, и без него нормально это место отрабатывает.

У тебя "1FA3088E   call        CWnd::ModifyStyleEx+4 (1fa51cb2)" - это как раз вызов new.
  

FormEx developer
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #18 - 06. Февраля 2007 :: 20:48
Печать  
artbear

твой перехваченный конструктор CBLProcInfo неверно отрабатывает (в CHookGroupContext).
аккуратнее надо с перехватом конструкторов, товарищ

P.S.
Вот вы говорите - тесты... Нет, братцы - сначала логика.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #19 - 07. Февраля 2007 :: 04:12
Печать  
kms писал(а) 06. Февраля 2007 :: 20:48:
твой перехваченный конструктор CBLProcInfo неверно отрабатывает (в CHookGroupContext).
аккуратнее надо с перехватом конструкторов, товарищ

P.S.
Вот вы говорите - тесты... Нет, братцы - сначала логика.

Вроде логика была в порядке, имхо знаний не хватило Улыбка

У меня были подозрения на конструктор, когда вчера писал свой пост. Но, внимательно повторно изучив свой перехват конструктора, ошибки так вчера, да и сегодня, так и не увидел.

Подскажи, в чем именно ошибка.

PS а ведь в других участках кода все работает!
CBLProcInfo создается и в других местах в ФормЕкс, и перехватчик событий ФормЕкс нормально с ним работает. Например, ФормЕкс::FindFunc
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #20 - 07. Февраля 2007 :: 06:32
Печать  
Вроде как понял, как ошибку поправить.
В 1С++ в своем коде исправил
Код
Выбрать все
void CHookGroupContext::CBLProcInfo_CBLProcInfo(void)
{
	{ // добавил спец.блок, без него не работает
		CBLProcInfo* ThisProcInfo = (CBLProcInfo*)this;
		CDllMethodWrapperGuard<PF_CBLProcInfo> wrapper(wrapperCBLProcInfo_CBLProcInfo);

		(ThisProcInfo->*wrapper.GetOrigMethod())();
	}

	wrapperForGroupContext.CBLProcInfo_CBLProcInfo();
}
 



Но и в исходниках ФормЕкс пришлось поправить
Service.cpp
Код
Выбрать все
case methCallAsProcedure:
...
		//CBLProcInfo * pProcInfo; // artbear // так не работает
		//pProcInfo = new CBLProcInfo(); // artbear // так не работает
		CBLProcInfo ProcInfo;// artbear // а вот так все в порядке
		CBLProcInfo * pProcInfo = &ProcInfo; //end
...
		//delete pProcInfo; //artbear  // так не работает
 


Баг пропадает.

Но до конца проблему так и не понял.
Понятно, что где-то косяк при работе конструктора для объекта, выделенного через new.

Жду совета.

PS ИМХО как временная мера, пока кто-то не укажет более верный путь, сойдет.
Тем более, что объект CBLProcInfo простой, и кроме данного места в ФормЕкс он ни в 1С++, ни в ФормЕкс не создается через new.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #21 - 07. Февраля 2007 :: 07:23
Печать  
Причем в 1С++ вариант создания CBLProcInfo через new работает при включенном перехватчике.
Проверял на Выполняемом модуле. Тесты 1С++ прошли все.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #22 - 07. Февраля 2007 :: 07:38
Печать  
Без new у меня падает.
  

FormEx developer
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #23 - 07. Февраля 2007 :: 08:02
Печать  
Цитата:
Без new у меня падает.

Падает, когда запускаешь ФормЕкс без 1С++ ?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
АЛьФ
FormEx developer
1c++ developer
Отсутствует



Сообщений: 1538
Местоположение: Санкт-Петербург
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #24 - 07. Февраля 2007 :: 08:12
Печать  
artbear писал(а) 07. Февраля 2007 :: 08:02:
Цитата:
Без new у меня падает.

Падает, когда запускаешь ФормЕкс без 1С++ ?

Да.
Точнее не совсем падает, а возникает ошибка в какой-то критической секции в дебрях MFC.
  

FormEx developer
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #25 - 07. Февраля 2007 :: 09:20
Печать  
Исправлено

Проблема в том, что для MSVC6 реализация конструктора имеет не тип void, а обязана возвращать указатель на класс.

Примерно так:

CBLProcInfo* CHookGroupContext::CBLProcInfo_CBLProcInfo(void)
{
return (CBLProcInfo*)this;
}


Мне интересно, будет ли это работать на других компиляторах?
Какая реализация в том же Intel C++?

Если кто-то проверит (нужно просто создать класс и посмотреть, как используются возвращаемые конструктором значения) - будет интересно.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Сервис::ВыполнитьПроцедуру - ошибка
Ответ #26 - 07. Февраля 2007 :: 09:53
Печать  
kms писал(а) 07. Февраля 2007 :: 09:20:
Проблема в том, что для MSVC6 реализация конструктора имеет не тип void, а обязана возвращать указатель на класс.

Да, вот этого я точно не знал Печаль
В Borland C++ с подобным не сталкивался Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать