22.01.2012, 18:19 | #1 |
Участник
|
Win2008 и вызов методов COM-объектов
Продолжение темы Новые счет-фактура и его друзья - Постановление от 26 декабря 2011 г. N 1137
Насчет 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')); 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))); } Ну и в качестве иллюстрации - во вложении пример иерарихии из нескольких классов, реализующий вышеизложенный подход для Excel (в чисто иллюстративных целях). Замечу, что с помощью подобной иерархии и небольших изменения в классе COMExcelDocument_RU делается выгрузка в Excel на терминальном сервере под 2008R2, на котором тусуется под сотню пользователей, а загрузка процессоров редко опускается ниже 70%, а зачастую составляет все сто Кстати, ко всему прочему, вызовы методов еще и быстрее выполняются
__________________
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 |
Участник
|
Здорово.
Даже не верится. Как-то слишком просто все получается. Получается, что если аккуратно переписать обращения к COM-объекту, то можно спокойно жить с текущим ядром. Получается что в MS про такое решение тоже не дотумкали, раз не предложили его для EVGL. По сути можно ведь создать просто фикс на X++, который поправит иерархию SysExcel и COMexcelDocument_RU и все станет красиво. Столько людей избавится от головной боли, а сотрудники MS от икоты |
|
22.01.2012, 20:37 | #3 |
Участник
|
Ну, я не со зла
__________________
Axapta v.3.0 sp5 kr2 |
|
22.01.2012, 20:39 | #4 |
Участник
|
так и не понял причем тут EVGL)))
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
22.01.2012, 20:49 | #5 |
Участник
|
Читайте исходную тему, из которой AndyD создал текущую. В стартовом сообщении есть ссылка на неё.
Вот сообщение EVGL : Новые счет-фактура и его друзья - Постановление от 26 декабря 2011 г. N 1137 |
|
26.01.2012, 14:45 | #6 |
MCITP
|
Интересная тема.
А может кто-то может выложить реальный рабочий образец COMExcelDocument_RU с данными изменениями?
__________________
Zhirenkov Vitaly |
|
26.01.2012, 17:03 | #7 |
MCITP
|
Почему-то у меня при попытке проиложить это к отчёту на 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 |
MCITP
|
Отбой, нашёл. В было пару мелких ошибок в проекте.
__________________
Zhirenkov Vitaly |
|
26.01.2012, 18:21 | #9 |
Участник
|
Да, прошу прощения
Для Visible надо инициализировать так X++: application_VisibleSet = this.createPropertyPut(#visible);
__________________
Axapta v.3.0 sp5 kr2 |
|
26.01.2012, 18:44 | #10 |
MCITP
|
Да, верно.
К слову, была ещё ошибка: В методе DEV_ExcelRange.valueSet пропущено отрицание: X++: if (range_ValueSet)
range_ValueSet = this.createPropertyPut(#value); X++: if ( ! range_ValueSet)
__________________
Zhirenkov Vitaly |
|
03.02.2012, 16:51 | #11 |
Участник
|
Немного смущает метод 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(); } 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 |
Участник
|
Вопрос автору. Имеет ли смысл создавать привязку всех методов COM объекта внутри функции attachMethods? Или же лучше создавать ее внутри каждого метода при первом вызове.
|
|
06.02.2012, 15:20 | #13 |
Участник
|
По-моему, нет
Многие методы могут вообще не вызываться за время жизни объекта - зачем создавать привязку? Изначально предполагал использовать привязку в этом методе для наиболее востребованных функций, но не думаю, что это как-то сильно увеличит производительность
__________________
Axapta v.3.0 sp5 kr2 |
|
06.02.2012, 15:22 | #14 |
Участник
|
Спасибо, так и думал
|
|
Теги |
com-объект, excel, excel com формат, windows server 2008 |
|
|