crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Получение массива QAxObject* с помощью QAxObject::dynamicCall()
Алексей
  опции профиля:
сообщение 27.2.2011, 11:20
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 29.8.2010
Пользователь №: 1988

Спасибо сказали: 0 раз(а)




Репутация:   0  


Программа SolidWorks. Согласно документации при вызове GetDocuments() мне должен быть возвращён массив COM объектов, с интерфейсом IModelDoc2 (с которыми, если работать по одиночкепроблем не возникает, например: QAxObject *activeDoc = sw->querySubObject("ActiveDoc");, кроме аналогичных проблем, с возвратом массива объектов подкомпонентов). Но при вызове dynamicCall("GetDocuments()"); мне возвращается QVariantList с 0 элементов.

пример
    QAxObject *sw = new QAxObject("SldWorks.Application", this); //Создаём
    sw->dynamicCall("Visible", TRUE); //Делаем видимым, если не видим

    int i2 = sw->dynamicCall("GetDocumentCount()").toInt(); //Количество открытых документов

    QVariant c = sw->dynamicCall("GetDocuments()");
    //режим отладки и typeName() подтверждают, что возвращён QVariantList
    QVariantList cList = c.toList();

    sw->dynamicCall("SendMsgToUser(QString)", QString::number(cList.count())+" - " + QString::number(i2));

в результате получаем сообщение 0 - 3, те в возвращённом листе 0 элементов, тjulf? как сама программа утверждает что 3

В инструкции также нащёл:
Цитата
In the .NET framework, an object array can be used for any System.Object type like integer, double, etc., for system marshaling to a VARIANT automatically. However, the use of a DispatchWrapper object is required for non-standard objects like SolidWorks interfaces, which are manipulated through the IDispatch interface.

Что я так понимаю как раз про мою ситуацию, когда возвращается массив интерфейсов от самой программы, и возможно мне нужен DispatchWrapper для qt.

Вобщем посоветуйте, каким образом разрешить ситуацию и получить массив объектов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей
  опции профиля:
сообщение 4.3.2011, 19:15
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 29.8.2010
Пользователь №: 1988

Спасибо сказали: 0 раз(а)




Репутация:   0  


Видимо не полная совместимость COM с Qt, так как на шарп.нете всё тоже самое работает всё отлично:

Раскрывающийся текст
using System;
using System.Linq;
using System.Runtime.InteropServices;
using System.Reflection;

namespace Sld
{
    public class SldAddIn
    {
        public void Method1()
        {
            string appProgID = "SldWorks.Application";
            // Получаем ссылку на интерфейс IDispatch
            Type swType = Type.GetTypeFromProgID(appProgID);
            // Запускаем SldWorks
            object sw = Activator.CreateInstance(swType);
            // Заносим в массив параметров правду)))
            object[] args = new object[1] { true };
            sw.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, sw, args);

            // Число открытых документов
            int count = (int)sw.GetType().InvokeMember("GetDocumentCount", BindingFlags.InvokeMethod, null, sw, null);
            // Список документов
            object[] models = (object[])sw.GetType().InvokeMember("GetDocuments", BindingFlags.InvokeMethod, null, sw, null);

            String result = String.Empty;
            foreach (object model in models)
            {
                result = result + (String)model.GetType().InvokeMember("GetPathName", BindingFlags.InvokeMethod, null, model, null) + "\n";
            }

            // Выводим список открытых документов
            System.Windows.Forms.MessageBox.Show(models.Count().ToString() + " - " + count.ToString() + "\n\n" + result);

            // Освобождение объекта SldWorks (если больше ничем не используется, то уничтожение)
            Marshal.ReleaseComObject(sw);
            // Вызываем сборщик мусора для немедленной очистамки пяти
            GC.GetTotalMemory(true);
        }
    }
}


Сообщение отредактировал Алексей - 4.3.2011, 19:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.3.2011, 21:49
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Алексей @ 4.3.2011, 21:15) *
Видимо не полная совместимость COM с Qt
если ни каких оговорок в документации по Qt нет, то отпишись тролям
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей
  опции профиля:
сообщение 15.3.2011, 12:03
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 29.8.2010
Пользователь №: 1988

Спасибо сказали: 0 раз(а)




Репутация:   0  


Не нащёл оговорок, запостил:
http://bugreports.qt.nokia.com/browse/QTBUG-18131
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.12.2024, 3:49