|  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 | 
|  | 
| 
 |