Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Очередной глобальный баг 1С, мешающий использованию ООП (и не только) (число прочтений - 4935 )
dfuy
Junior Member
**
Отсутствует



Сообщений: 41
Зарегистрирован: 18. Марта 2013
Re: Очередной глобальный баг 1С, мешающий использованию ООП (и не только)
Ответ #15 - 05. Мая 2017 :: 16:00
Печать  
vladimirmir2012 писал(а) 05. Мая 2017 :: 03:42:
Просьба залить ...

Нашёл ссылку на тему с новой IDA 6.8: https://forum.reverse4you.org/showthread.php?t=2258
Там есть рабочие ссылки, у меня вторая же пошла. Пока не запускал ещё, не знаю чего там нового придумали. Моя текущая версию 1c_classes.h: https://yadi.sk/d/uWu8TA3v3HiSY2
Там не много изменений. Ещё структура CTypedValue должна быть добавлена тут: https://cloud.mail.ru/public/8MCv/H24MLteKK (отсюда)

PS. Вторая ссылка какая-то тормозная и не докачивается. Из 3й и 4й скачались две какие-то разные версии: обычная и Green. ХЗ чем отличаются, потом поразбираюсь.
  
Наверх
 
IP записан
 
dfuy
Junior Member
**
Отсутствует



Сообщений: 41
Зарегистрирован: 18. Марта 2013
Re: Очередной глобальный баг 1С, мешающий использованию ООП (и не только)
Ответ #16 - 05. Мая 2017 :: 20:02
Печать  
Итак, опробовал метод по навешиванию трапа на оператор присваивания. Не вдаваясь в подробности реализации перехватчиков, таким вот примерно макаром:

Код (C++)
Выбрать все
class myCValue: public CValue
{
public:
	CValue const &OperatorAssign(CValue const &Source);
};

CTrap trapOperatorAssign("bkend.dll", "??4CValue@@QAEABV0@ABV0@@Z", GetMethAddr(&myCValue::OperatorAssign));
// public: class CValue const & __thiscall CValue::operator=(class CValue const &)

CValue const &myCValue::OperatorAssign(CValue const &Source)
{
	if (Source.m_TypeCode==0) return Reset(),*this;

	CTrapSwap Swap(trapOperatorAssign);
	return (this->*trapOperatorAssign.Old(&OperatorAssign))(Source);
} 



Работает прекрасно. Причём одним махом решает все описанные проблемы (и неописанные тоже). Только вот убивает меня вешать трап на такую часто вызываемую вещь, как оператор присваивания, поскольку может сказаться на производительности, которая итак не фонтан. Есть идея слить весь его код, полностью подменив оригинальный, и поправить по собственному вкусу (опыт такой был уже, так что думаю проблем не возникнет). Займусь на досуге...

Работает, но не так уж и прекрасно. Уже объявились нюансы. Например, можно оператором присваивания затереть ссылку на исполняемый модуль. Если сделать это не с помощью пустого значения (а любого другого), трап восстановит исходную версию кода и вызовет родной оператор. Тот, в свою очередь, потрёт ссылку, модуль начнёт уничтожаться, а там объекты всякие с деструкторами. Деструкторы начнут работать, выполняя всякий код, а оператор присваивания при этом будет уже родной со всеми вытекающими... Короче, не канает такой метод, только полное дублирование кода оператора с необходимыми изменениями.
« Последняя редакция: 06. Мая 2017 :: 19:17 - dfuy »  
Наверх
 
IP записан
 
dfuy
Junior Member
**
Отсутствует



Сообщений: 41
Зарегистрирован: 18. Марта 2013
Re: Очередной глобальный баг 1С, мешающий использованию ООП (и не только)
Ответ #17 - 06. Мая 2017 :: 19:10
Печать  
Оператор присваивания успешно написан и вроде успешно работает (погонял на нескольких достаточно сложных вещах, всё работает, позже внедрю в рабочую базу, там уж точно станет ясно). Теперь точно все варианты багов исчезли. И никаких тормозов. И даже кое-что получше переписал там. Код приводить не буду, ибо он сильно завязан на моих наработках, которых нет в стандартном наборе 1CHEADERS из 1С++. Но могу скомпилить в виде отдельной dll-ки. Достаточно её подгрузить в 1С и оператор присваивания заработает как ему положено.

Обновил 1c_classes.h, ссылка та же. Теперь там много изменений. Я по пути ещё прикольные вещи раскопал. Давно мечтал получить информацию о наличии у параметров методов значения по умолчанию, ибо исполняемый модуль, а как следствие и объекты ООП, не могли вызывать методы с параметрами по умолчанию. Было очень неудобно. Теперь такой проблемы нет: вот такой код
Код (C++)
Выбрать все
CCompiledProcDescr &Proc=*pIntInfo->pCompiledModule->ProcArray[Index];
CString Text(Proc.Name);
Text+='(';
for (int n=0;n<Proc.NParams;n++)
{
	CCompiledProcVarDescr &Var=*Proc.VarList[n];
	if (n) Text+=',';
	Text+=Var.Name;
	if (Var.DefValuePos<0) continue;

	Text+='=';
	CCompiledConstDescr &Const=*pIntInfo->pCompiledModule->ConstArray[Var.DefValuePos];
	if (Const.Value.m_TypeCode==STRING_TYPE_1C) Text+='"'; else
	if (Const.Value.m_TypeCode==DATE_TYPE_1C) Text+='\'';
	Text+=Const.Value.Format();
	if (Const.Value.m_TypeCode==STRING_TYPE_1C) Text+='"'; else
	if (Const.Value.m_TypeCode==DATE_TYPE_1C) Text+='\'';
}
Text+=')';
 

позволяет получить всю информацию о параметрах метода, включая значения по умолчанию. Вот мои 1cheaders, с которыми он вроде с ходу должен заработать.
  
Наверх
 
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Очередной глобальный баг 1С, мешающий использованию ООП (и не только)
Ответ #18 - 07. Мая 2017 :: 04:00
Печать  
.
« Последняя редакция: 13. Сентября 2018 :: 06:26 - vladimirmir2012 »  
Наверх
 
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: Очередной глобальный баг 1С, мешающий использованию ООП (и не только)
Ответ #19 - 07. Мая 2017 :: 05:24
Печать  
.
« Последняя редакция: 13. Сентября 2018 :: 06:26 - vladimirmir2012 »  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать