AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2012, 18:19   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (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 Кб, 648 просмотров)
__________________
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).
Старый 22.01.2012, 20:33   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Здорово.
Даже не верится.
Как-то слишком просто все получается.

Получается, что если аккуратно переписать обращения к COM-объекту, то можно спокойно жить с текущим ядром.

Получается что в MS про такое решение тоже не дотумкали, раз не предложили его для EVGL. По сути можно ведь создать просто фикс на X++, который поправит иерархию SysExcel и COMexcelDocument_RU и все станет красиво. Столько людей избавится от головной боли, а сотрудники MS от икоты
Старый 22.01.2012, 20:37   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ну, я не со зла
__________________
Axapta v.3.0 sp5 kr2
Старый 22.01.2012, 20:39   #4  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
так и не понял причем тут EVGL)))
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.01.2012, 20:49   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Pustik Посмотреть сообщение
так и не понял причем тут EVGL)))
Читайте исходную тему, из которой AndyD создал текущую. В стартовом сообщении есть ссылка на неё.

Вот сообщение EVGL :
Новые счет-фактура и его друзья - Постановление от 26 декабря 2011 г. N 1137
Старый 26.01.2012, 14:45   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
?
Интересная тема.
А может кто-то может выложить реальный рабочий образец COMExcelDocument_RU с данными изменениями?
__________________
Zhirenkov Vitaly
Старый 26.01.2012, 17:03   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
?
Почему-то у меня при попытке проиложить это к отчёту на ComExcelDocument_RU всё рушится при первой же попытке использовать перегруженный метод visible() (в методе initApplication()).

Не могу понять что не так.

Единственное изменение, которое внёс пока ComExcelDocument_RU:

X++:
#define.ExcelProgId("Excel.Application")
protected void newCom()
{
    //BP deviation documented
    //m_comApplication = new COM(#ExcelProgId);
     m_comApplication = new DEV_ExcelApplication(new COM(#ExcelProgId));
}
__________________
Zhirenkov Vitaly
Старый 26.01.2012, 18:18   #8  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Отбой, нашёл. В было пару мелких ошибок в проекте.
__________________
Zhirenkov Vitaly
Старый 26.01.2012, 18:21   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от ZVV Посмотреть сообщение
Отбой, нашёл. В было пару мелких ошибок в проекте.
Да, прошу прощения

Для Visible надо инициализировать так
X++:
application_VisibleSet = this.createPropertyPut(#visible);
__________________
Axapta v.3.0 sp5 kr2
Старый 26.01.2012, 18:44   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Да, верно.

К слову, была ещё ошибка:

В методе DEV_ExcelRange.valueSet пропущено отрицание:
X++:
   if (range_ValueSet)
         range_ValueSet = this.createPropertyPut(#value);
Надо
X++:
if ( ! range_ValueSet)
А так вроде первичный тест прошёл успешно...
__________________
Zhirenkov Vitaly
Старый 03.02.2012, 16:51   #11  
Максимка is offline
Максимка
Участник
 
19 / 23 (1) +++
Регистрация: 28.06.2006
Немного смущает метод new в DEV_Com. Вторая ветка условия не выполнится никогда:
X++:
public void new(anytype _interface) 
{
    COM         com;
    COMVariant  var;
    ;

    super();
    if (typeof(_interface) == Types::Class && classidget(_interface) == classnum(COM))
    {
        com = _interface;
        this.attach(com.interface());
        com = null;
    }
    else if (typeof(_interface) == Types::Class && classidget(_interface) == classnum(COM))
    {
        var = _interface;
        this.attach(com.iDispatch());
        var = null;
    }
    else if (typeof(_interface) == Types::Integer)
        this.attach(_interface);

    this.attachMethods();
}
Видимо там подразумевftnся условие для COMVariant, и тогда должно быть:
X++:
...
else if (typeof(_interface) == Types::Class && classidget(_interface) == classnum(COMVariant))
    {
        var = _interface;
        this.attach(var.iDispatch());
        var = null;
    }
...
Старый 06.02.2012, 15:10   #12  
Максимка is offline
Максимка
Участник
 
19 / 23 (1) +++
Регистрация: 28.06.2006
?
Вопрос автору. Имеет ли смысл создавать привязку всех методов COM объекта внутри функции attachMethods? Или же лучше создавать ее внутри каждого метода при первом вызове.
Старый 06.02.2012, 15:20   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
По-моему, нет
Многие методы могут вообще не вызываться за время жизни объекта - зачем создавать привязку?

Изначально предполагал использовать привязку в этом методе для наиболее востребованных функций, но не думаю, что это как-то сильно увеличит производительность
__________________
Axapta v.3.0 sp5 kr2
Старый 06.02.2012, 15:22   #14  
Максимка is offline
Максимка
Участник
 
19 / 23 (1) +++
Регистрация: 28.06.2006
Спасибо, так и думал
Теги
com-объект, excel, excel com формат, windows server 2008

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пакетная печать com-объектов на терминальном сервере Serg DAX: Программирование 1 22.10.2010 07:06
Gustav: Unsorted, или Записки DAX-дилетанта - II Gustav DAX Blogs 39 20.05.2009 15:34
Developer for Microsoft Dynamics AX Certification Roadmap Blog bot DAX Blogs 1 13.05.2009 16:17
msdynamicsax: VB script that test the com connector for Dynamics Ax 4.0 Blog bot DAX Blogs 0 25.08.2008 18:05
Com Connector и вызов статического метода Gorlum DAX: Программирование 2 11.08.2005 01:39

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:15.