Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно? / 6 сообщений из 6, страница 1 из 1
17.07.2013, 20:22:35
    #38334754
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?

Есть метод getEntity http://vbamodel.narod.ru/AutoCAD/idh_getentity.htm в классе AcadUtility http://vbamodel.narod.ru/AutoCAD/idh_utility_object.htm
не могу правильно вызвать его под Java.

Работающий пример реализации getPoint http://vbamodel.narod.ru/AutoCAD/idh_getpoint.htm
Код: java
1.
2.
3.
    private Point getPoint(Variant point, Variant question) {
        return new Point(Dispatch.call(this.createdFrom.toDispatch(), "GetPoint", point, question));
    }



Полный код:
AcadUtility.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
package eof.java4autocad.entities;

import com.jacob.com.Dispatch;
import com.jacob.com.SafeArray;
import com.jacob.com.Variant;
import eof.java4autocad.Point;

public class AcadUtility extends AcadObject {

    public AcadUtility(Variant createdFrom, AcadApplication application) {
        super(createdFrom, application);
    }

//    public void getEntity(Variant entity, Variant points, String question) {
    public void getEntity() {
//        Dispatch.call(this.createdFrom.toDispatch(), "GetEntity", entity, points, new Variant(question));

        Variant entity = new Variant();
        Variant points = new Variant();
        SafeArray saEntity = new SafeArray(Variant.VariantObject, 1);
        entity.putSafeArray(saEntity);
//        SafeArray saPoints = new SafeArray(Variant.VariantDouble, 1);
        SafeArray saPoints = new SafeArray(Variant.VariantArray, 1);
        points.putSafeArray(saPoints);

//        Object[] args = {
//            entity,
//            points,
//            new Variant("hello")};
//        Dispatch.invoke(createdFrom.toDispatch(), "GetEntity", Dispatch.Get, args, new int[1]);

//        Dispatch.call(this.createdFrom.toDispatch(), "GetEntity", entity, points, new Variant("Вопрос"));
        Dispatch.call(this.createdFrom.toDispatch(), "GetEntity", saEntity, saPoints, new Variant("Вопрос"));
    }

    //<editor-fold defaultstate="collapsed" desc="getPoint">
    private Point getPoint(Variant point, Variant question) {
        return new Point(Dispatch.call(this.createdFrom.toDispatch(), "GetPoint", point, question));
    }

    public Point getPoint(Point point, String question) {
        return getPoint(point.toVariant(), new Variant(question));
    }

    public Point getPoint(Point point) {
        return getPoint(point.toVariant(), Variant.VT_MISSING);
    }

    public Point getPoint(String question) {
        return getPoint(Variant.VT_MISSING, new Variant(question));
    }

    public Point getPoint() {
        return getPoint(Variant.VT_MISSING, Variant.VT_MISSING);
    }
    //</editor-fold>
}

AcadObject.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
package eof.java4autocad.entities;

import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public abstract class AcadObject {

    public final Variant createdFrom;
    public final AcadApplication application;

    public AcadObject(Variant createdFrom, AcadApplication application) {
        this.createdFrom = createdFrom;
        this.application = application;
    }

    public void delete() {
        Dispatch.call(this.createdFrom.toDispatch(), "Delete");
    }

    public int getObjectId() {
        Variant variant = Dispatch.get(this.createdFrom.toDispatch(), "ObjectId");
        return variant.getInt();
    }
}

...
Рейтинг: 0 / 0
17.07.2013, 21:34:25
    #38334818
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
avp.mk,
1. А что? Долго проверить?
2. В delphi out параметр ничем особо не отличается от var параметра. Т.е. по ссылке.
imho
...
Рейтинг: 0 / 0
17.07.2013, 21:47:21
    #38334829
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
Забаньте кто-нибудь уже его.
...
Рейтинг: 0 / 0
17.07.2013, 22:46:50
    #38334870
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
avp.mk,
Кого? Вопросы со словом Возможно? и Можно? )
...
Рейтинг: 0 / 0
18.07.2013, 00:07:03
    #38334908
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
avp.mkне могу правильно вызвать его под Java.
Смог вызвать. Автокад реагирует. Теперь проблема забрать данные из out параметров.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public void getEntity() {
        Dispatch
                dispatchEntity = new Dispatch(),
                dispatchPoints = new Dispatch();
//        Variant
//                entity = new Variant(dispatchEntity, true),
//                points = new Variant(dispatchPoints, true);
        Variant
                entity = new Variant(dispatchEntity, false),
                points = new Variant(dispatchPoints, false);
        
        //Вызов проходит
        Dispatch.call(createdFrom.toDispatch(), "GetEntity", entity, points, new Variant("Выберите объект:"));
//        Dispatch.call(createdFrom.toDispatch(), "GetEntity", dispatchEntity, dispatchPoints, new Variant("Выберите объект:"));
        
        //возвращает null
        System.out.println(Dispatch.get(entity.toDispatch(), "ObjectId"));
    }
...
Рейтинг: 0 / 0
18.07.2013, 16:46:23
    #38335921
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
Может через Jawin кто-нибудь знает как реализовать?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
package jawin2acad;

import java.io.UnsupportedEncodingException;
import org.jawin.COMException;
import org.jawin.DispatchPtr;
import org.jawin.win32.Ole32;

public class Jawin2acad {

    public static void main(String[] args) throws UnsupportedEncodingException {
        try {
            Ole32.CoInitialize();

            DispatchPtr acad = new DispatchPtr("Autocad.Application");
            acad.put("Visible", true);

            DispatchPtr document = (DispatchPtr) acad.get("ActiveDocument");

            DispatchPtr model = (DispatchPtr) document.get("ModelSpace");
            double[] a = {0.0, 0.0, 0.0}, b = {100.0, 100.0, 0.0};
            model.invoke("AddLine", a, b);

            DispatchPtr utility = (DispatchPtr) document.get("Utility");

            Object
                    i_need_this = null,
                    and_this = null; // (хотя без второго параметра могу и обойтись)

            utility.invoke("GetEntity", i_need_this, and_this, "it works");
            
        } catch (COMException e) {
            String message = e.getMessage();
            String reencoded = new String(message.getBytes("cp1252"), "cp1251");
            System.out.println(message);
            System.out.println(reencoded);
        } finally {
            try { Ole32.CoUninitialize(); } catch (COMException ex) {}
        }
    }
}
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]