Показать сообщение отдельно
Старый 22.01.2012, 18:19   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Win2008 и вызов методов COM-объектов
Продолжение темы Новые счет-фактура и его друзья - Постановление от 26 декабря 2011 г. N 1137

Цитата:
Сообщение от Logger Посмотреть сообщение
Можно подробнее ?
Не понял вашу мысль.
Насчет ComDispFunction - я уже писал, что с помощью этого класса вызовы методов COM-классов происходят без ошибок. По-моему, при этом применяется раннее связывание

Насчет ООП - вспоните, что класс Com в аксапте это точно такой же класс, как и любой другой и что от него можно создавать наследников.
Так же вспоните, что у этого класса есть замечательный метод attach(), позволяющий подключить к созданному экземпляру класса уже существующий COM-класс
Еще вспомните про то, что можно перекрывать методы и создавать в них собственный код.


В общем, идея была такая - необходимо создать иерархию классов, наследующих от класса Com и соотвествующую иерархии вызываемых COM-объектов.
В метод new() классов иерархии передавать ссылку на созданный COM-объект и с помощью вызова метода attach() создавать привязку
Перекрыть вызываемые методы COM-объекта. Внутри этих методов делать вызов с помощью класса ComDispFunction
Если вызываемый метод возвращает ссылку на другой COM-объект, то возвращать ссылку на экземпляра класса иерархии, в вызов new() которого передавать COM-объект


В результате, для корректной работы, требется изменить вызов первоначального создания COM-объекта в Аксапте на создание соответствующей класса из иерархии с передачей в него COM-объекта
Для Excel это будет выглядеть примерно так
X++:
COM excel;
;

excel = new DEV_ExcelApplication(new Com('Excel.Application'));
И отследить прямое создание COM-объектов в коде. Такие как, например, в методе SysExcelCells.Item()
X++:
public SysExcelCell item(int _row, int _column)
{
    return SysExcelCell::construct(version,cells.item(_row,_column));
//    return SysExcelCell::construct(version,COM::createFromVariant(cells.item(_row,_column)));
}
Если не перекрывать какие-либо методы из вызываемого COM-объекта, то ничего страшного не случится. При вызове будет ипользоваться позднее связывание - с ненулевой вероятностью напороться на ошибку при вызове

Ну и в качестве иллюстрации - во вложении пример иерарихии из нескольких классов, реализующий вышеизложенный подход для Excel (в чисто иллюстративных целях).


Замечу, что с помощью подобной иерархии и небольших изменения в классе COMExcelDocument_RU делается выгрузка в Excel на терминальном сервере под 2008R2, на котором тусуется под сотню пользователей, а загрузка процессоров редко опускается ниже 70%, а зачастую составляет все сто

Кстати, ко всему прочему, вызовы методов еще и быстрее выполняются
Вложения
Тип файла: xpo DEV_Excel.xpo (27.8 Кб, 636 просмотров)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: raz (15), belugin (3), ZVV (7), sukhanchik (10), Bishop (3), Logger (15), Ace of Database (10), lev (13), MikeR (3), gl00mie (10), Максимка (1), S.Kuskov (10), pedrozzz (4), БАХ43 (1).