Использование COM-объектов
Использование в среде Visual J++ созданного в ней же объекта не сложнее, чем любого другого COM-объекта, и строится на разборе библиотеки типов. Обратимся к примеру. Командой File•New Project•New•Applications доберемся до мастеров создания оконных приложений. Нас интересует Windows Application. После создания такого проекта в форму окна приложения помещаются две кнопки: «Запустить Word» и «Закончить сеанс Windows». Как вы, наверное, уже догадались, в обработчиках нажатий этих кнопок и будут вызываться методы объекта. Но об этом чуть позже. Главный вопрос: как обратиться к COM-объекту? Для этого мы должны создать «обертки», которые позволят обратиться из класса Java в сущность, нейтральную к языку программирования. И для этого в среде разработчика в меню Project есть специальная команда Add COM Wrapper. Вызовем ее и увидим, что в списке компонент COM есть и творение наших рук. Нужно только отметить его галочкой (рис. 6).
Рис. 3.6.
В результате будет сгенерирован новый пакет com_object, названный так по имени проекта, в котором COM-объект создавался. В этом пакете есть пара новых файлов. Вот первый из них (класс CoMirPK), являющийся шлюзом к двоичному коду компоненты:
package com_object; import com.ms.com.*; import com.ms.com.IUnknown; import com.ms.com.Variant; /** @com.class(classid=C0038C80-C7ED-4D8E-9E18-C90AA7EF1C67, DynamicCasts) @com.interface(iid=1127D7AF-52C0-4547-8C7D-4E492C5130D2, thread=AUTO, type=DISPATCH) */ public class CoMirPK implements IUnknown,com.ms.com. NoAutoScripting,com_object.CoMirPK_Dispatch { /** @com.method(dispid=100, type=METHOD, name=”wait”, returntype=VOID) @com.parameters([in,out,elementType=VARIANT,type=PTR] Parameter0, [in,out,elementType=VARIANT,type=PTR] Parameter1, [type=VARIANT] return) */ public native Variant wait(Variant Parameter0, Variant Parameter1); /** @com.method(dispid=101, type=METHOD, name=”runWord”, returntype=VOID) @com.parameters([in,type=STRING] Parameter0) */ public native void runWord(String Parameter0); // hashCode UNMAPPABLE: Name is a keyword or conflicts with another member. // public native int hashCode(); // toString UNMAPPABLE: Name is a keyword or conflicts with another member. // public native String toString(); // equals UNMAPPABLE: Name is a keyword or conflicts with another member. // public native boolean equals(Object Parameter0); /** @com.method(dispid=105, type=METHOD, name=”userLogOff”, returntype=VOID) @com.parameters() */ public native void userLogOff(); // notify UNMAPPABLE: Name is a keyword or conflicts with another member. // public native void notify(); // getClass UNMAPPABLE: Name is a keyword or conflicts with another member. // public native Object getClass(); // notifyAll UNMAPPABLE: Name is a keyword or conflicts with another member. // public native void notifyAll(); public static final com.ms.com._Guid iid = new com.ms.com. _Guid((int)0x1127d7af, (short)0x52c0, (short)0x4547, (byte)0x8c, (byte)0x7d, (byte)0x4e, (byte)0x49, (byte)0x2c, (byte)0x51, (byte)0x30, (byte)0xd2); public static final com.ms.com._Guid clsid = new com.ms.com. _Guid((int)0xc0038c80, (short)0xc7ed, (short)0x4d8e, (byte)0x9e, (byte)0x18, (byte)0xc9, (byte)0xa, (byte)0xa7, (byte)0xef, (byte)0x1c, (byte)0x67); }
Второй интерфейс, CoMirPK_Dispatch, нужен для установки связи посредством автоматизации OLE и поддерживает вызов методов компоненты с помощью интерфейса IDispatch, за что и получил свое имя:
package com_object; import com.ms.com.*; import com.ms.com.IUnknown; import com.ms.com.Variant; // Dispatch-only interface CoMirPK_Dispatch /** @com.interface(iid=1127D7AF-52C0-4547-8C7D-4E492C5130D2, thread=AUTO, type=DISPATCH) */ public interface CoMirPK_Dispatch extends IUnknown { /** @com.method(dispid=100, type=METHOD, name=”wait”, returntype=VOID) @com.parameters([in,out,elementType=VARIANT,type=PTR] Parameter0, [in,out,elementType=VARIANT,type=PTR] Parameter1, [type=VARIANT] return) */ public Variant wait(Variant Parameter0, Variant Parameter1); /** @com.method(dispid=101, type=METHOD, name=”runWord”, returntype=VOID) @com.parameters([in,type=STRING] Parameter0) */ public void runWord(String Parameter0); /** @com.method(dispid=105, type=METHOD, name=”userLogOff”, returntype=VOID) @com.parameters() */ public void userLogOff(); public static final com.ms.com._Guid iid = new com.ms.com. _Guid((int)0x1127d7af, (short)0x52c0, (short)0x4547, (byte)0x8c, (byte)0x7d, (byte)0x4e, (byte)0x49, (byte)0x2c, (byte)0x51, (byte)0x30, (byte)0xd2); }
Директивы, начинающиеся с @com, описывают мета-информацию о компоненте, взятую из библиотеки типов: числовой идентификатор метода, его параметры, имя и т. д. Программа, которая использует COM-компоненту, обязательно должна содержать строку импорта всех классов пакета com_object:
import com_object.*; Одно из полей класса программы описывает ссылку на интерфейс автоматизации: . . . CoMirPK_Dispatch component; . . . а значение присваивается ей внутри конструктора класса: . . . // TODO: Add any constructor code after initForm call component = new CoMirPK(); . . . Теперь перейдем к обработчикам, из которых вызываются методы COM-объекта. Тот, что вызывается в ответ на нажатие кнопки «Запустить Word», выглядит следующим образом:
private void button1_click(Object source, Event e) { // Запустить Word component.runWord(null); }
Приведем исходный текст обработчика нажатия кнопки «Закончить сеанс Windows»:
private void button2_click(Object source, Event e) { // Закончить сеанс Windows component.userLogOff(); }
Попробуйте готовую тестовую программу в деле. Заодно испытайте компоненту в других средах, например, в Borland C++Builder.
Популярное: Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (495)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |