powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
6 сообщений из 6, страница 1 из 1
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
    #38334754
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вызов 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
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
    #38334818
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,
1. А что? Долго проверить?
2. В delphi out параметр ничем особо не отличается от var параметра. Т.е. по ссылке.
imho
...
Рейтинг: 0 / 0
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
    #38334829
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забаньте кто-нибудь уже его.
...
Рейтинг: 0 / 0
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
    #38334870
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,
Кого? Вопросы со словом Возможно? и Можно? )
...
Рейтинг: 0 / 0
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
    #38334908
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
    #38335921
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может через 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
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов COM-OLE метода с out param'етром при помощи Jacob. Возможно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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