306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
1

AddIn к Visio в виде DLL

15.12.2010, 00:37. Показов 2221. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чегой-то совсем запутался.
Есть AddIn к Visio в виде DLL. В нем получаются размеры и положение фигур. Т.е. имеется список записей, содержащие размеры фигур. В нем же запоминается COM-интерфейс на соответсвующую фигуру. Пока было для каждой страницы свой список - все работало без проблем. Когда решил сэкономить памяти и иметь один список только для активной страницы, то проявилась странность - при повторном получении списков (т.е. COM-интерфейсов) происходит увеличение времени, причем в геометрической прогрессии. Т.е. при первом чтении порядка 16 мс (500 фигур), при втором время увеличивается до 36 мс, при третьем - полминуты, при следующем - вообще все 5 минут. Причем, при получении другой страницы, т.е. других фигур, задержки нет, задержка только при переполучении фигур, которые уже получались в этом сеансе работы. Даже предположений нет, с чем такое поведение связано.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2010, 00:37
Ответы с готовыми решениями:

Com в виде dll
// Client.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h"...

Создание внутреннего COM в виде dll
Ребят, помогите добить проект, я только учусь, не обессудьте... Создаю простое COM приложение в...

Компонент в виде таблицы в Visio для VBA
нужен какой нить компонент в виде таблицы в Visio, чтоб с ним можно было из VBA работать, писать в...

Добавление элементов Visio и интеграция Visio
Добрый день, прошу подсказать чайнику) Есть ли возможность подключения функционала visio viewer и...

4
Эксперт С++
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
15.12.2010, 00:56 2
Нужно больше информации, как именно получаются фигуры, как храните указатели и т.д. Желательно увидеть код.
1
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
15.12.2010, 12:45  [ТС] 3
Ну, весь код довольно объемный, вряд-ли появится желание в нем копаться (к тому же я уже тот вариант потерял, как неприемлемый).

А если вкратце, то примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CMyShape {
    CVisioShape vShape; // CVisioShape – класс от MS, простая обертка для интерфейсов IVShape
                                         // фактически никаких собственных членов не имеет, кроме счетчика ссылок 
                                         // несколько конструкторов и перегруженных операторов, все остальное – просто
                                         // вызов соответствующих методов COM-объекта
    long mID;
    long mLeft;
    ... и другие члены
public:
    CMyShape(CVisioShape & vSp) : vShape(vSp) { получение размеров фигуры }
    ~CMyShape() { } // по идее ведь должен автоматом быть вызван деструктор и для встроенного vShape ?
}; // ну и еще есть два класса, наследованные от этого, но там только добавлены некоторые простые данные
 
typedef CMyShape *pShape;
class CMyShapesList - список – типа динамического массива указателей pShape
его методы:
1. void Add(pShape sp);
добавляю переданный указатель в список
Передаваемый здесь объект создается где-то в другой процедуре путем new CMyShape(vShape)
vShape получается двумя способами: 1) созданием объекта CVisioShape из pObj->QueryInterface(IID_Shape), где pObj – типа *IDispatch (фактически, если глянуть конструктор этого CVisioShape, то это просто запрос требуемого IID и увеличение счетчика ссылок)
2) возвращается из перечисления фигур страницы (просто как во всем офисе получение элемента "коллекции")

2. void Delete(idx) – удаление указателя с указанным индексом из списка. Сам объект удаляется тоже самим вызывающим путем простого delete.

Если предположить, что какие-то интерфейсы не освобождаются, то почему не растет объем используемой памяти, а главное, почему при переходе на другую страницу и получение других фигур, которых может быть так же много, как и на покидаемой странице, задержки не происходит.

Не знаю, насколько понятно изложил, но в любом случае спасибо. Мое решение пока что остается в получении каждый раз при необходимости нужного интерфейса (или, если быть точным, объявление и инициализация локальной переменной типа CVisioShape, который автоматом уничтожается, как любая локальная переменная.)

Кстати, вот еще такой вопрос: как (и можно ли вообще) объявить переменную типа COM-объекта в одной процедуре, а инициализировать ее - в другом месте, скажем вызовом функции со ссылкой на эту переменную. Как это правильно делается на C++?
0
Эксперт С++
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
16.12.2010, 02:43 4
kukuruku310, проверьте уменьшается ли счетчик ссылок CVisioShape в деструкторе CMyShape.
Цитата Сообщение от kukuruku310 Посмотреть сообщение
как (и можно ли вообще) объявить переменную типа COM-объекта в одной процедуре, а инициализировать ее - в другом месте, скажем вызовом функции со ссылкой на эту переменную. Как это правильно делается на C++?
Если я правильно Вас понял, то вот:
C++
1
2
3
4
5
6
7
8
IInterface* Create() {
  IInterface* pInterface = 0;
  Initialize(&pInterface);
}
 
void Initialize(IInterface** ppInterface) {
  // В *ppInterface записываем нужный указатель
}
1
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
16.12.2010, 12:36  [ТС] 5
Спасибо. А AddRef и Release надо делать?

Добавлено через 2 минуты
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
kukuruku310, проверьте уменьшается ли счетчик ссылок CVisioShape в деструкторе CMyShape
Все уменьшается и увеличивается как надо. Да и иначе ведь было бы без разницы - переходим на другую страницу или на ту, которая ранее уже окрывалась. Насколько я понимаю.
Вполне может быть, что это просто какой-то глюк самого Visio. По крайней мере недавно вот обнаружил такую странность: если указать в свойствах Visio расположение файлов (т.е. dafault-путь к открыть-сохранить) что-нибудь отличное от "Мои документы", пусть даже полный путь к той же самой "Документы", то при первом сохранении файла возникает жуткая задержка и куча сбоев "Обращение к серверу" в системном журнале. Так что вполне допускаю, что и "переполучение" имеет в Visio какие-то тонкости. Просто это мой первый и единственный серъезный опыт в C++, поэтому и возникли смутные подозрения в своей собственной левоногости и твердолобости...
0
16.12.2010, 12:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2010, 12:36
Помогаю со студенческими работами здесь

Visio Связь данных Excel с Visio
Здравствуйте! Подскажите, пожалуйста: есть Excel с данными по связям внутри системы (АСУТП). Нужно...

Gui на qt в виде dll
Возникла проблема такого плана: есть приложение работающее вообще без gui, было решено что к нему...

AddIn из VB в VBA
У меня есть AddIn в VB6 мной написанный, простенький. он создает шаблоны часто используемого кода и...

Addin и VS2010 Professional
Доброго всем! Уже неделю бьюсь над проблемой Add-in(а) в студии Месяц назад когда уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru