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

AddIn к Visio в виде DLL

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

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

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

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

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

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

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

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
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
16.12.2010, 02:43
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
Сообщений: 547
16.12.2010, 12:36  [ТС]
Спасибо. А AddRef и Release надо делать?

Добавлено через 2 минуты
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
kukuruku310, проверьте уменьшается ли счетчик ссылок CVisioShape в деструкторе CMyShape
Все уменьшается и увеличивается как надо. Да и иначе ведь было бы без разницы - переходим на другую страницу или на ту, которая ранее уже окрывалась. Насколько я понимаю.
Вполне может быть, что это просто какой-то глюк самого Visio. По крайней мере недавно вот обнаружил такую странность: если указать в свойствах Visio расположение файлов (т.е. dafault-путь к открыть-сохранить) что-нибудь отличное от "Мои документы", пусть даже полный путь к той же самой "Документы", то при первом сохранении файла возникает жуткая задержка и куча сбоев "Обращение к серверу" в системном журнале. Так что вполне допускаю, что и "переполучение" имеет в Visio какие-то тонкости. Просто это мой первый и единственный серъезный опыт в C++, поэтому и возникли смутные подозрения в своей собственной левоногости и твердолобости...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2010, 12:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru