Вставляю ActiveX контрол в документ Word, все
нормально только измененные св-ва контрола не
сохраняются после загрузки документа *.doc
Уже вставил поддержку интерфейса
IPersistPropertyBag, эффекта нет.
Может кто знает в чем дело.
Здравствуйте Аноним, вы писали:
А>Вставляю ActiveX контрол в документ Word, все А>нормально только измененные св-ва контрола не А>сохраняются после загрузки документа *.doc А>Уже вставил поддержку интерфейса А>IPersistPropertyBag, эффекта нет. А>Может кто знает в чем дело.
Добавь IPersistStream и IPersistStreamInit (а может и Сторэдж)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: ActiveX и Word.
От:
Аноним
Дата:
01.08.01 04:09
Оценка:
VD>Добавь IPersistStream и IPersistStreamInit (а может и Сторэдж)
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
Re[4]: ActiveX и Word.
От:
Аноним
Дата:
01.08.01 08:26
Оценка:
Здравствуйте Tim, вы писали:
Tim>А в карту свойств свои не забыл добавить? Tim>к примеру
Tim>BEGIN_PROP_MAP(CMyControl) Tim> PROP_DATA_ENTRY("myprop", m_int, VT_UI4) Tim>END_PROP_MAP()
Обязательно, только другим макросом, может быть из-за этого ?
PROP_ENTRY("ShowCheck", 11, CLSID_NULL)
1. Всетаки проверь наличие IPersistStream. По-моему, ATL его автоматом не добаляет. Должно быть чтото вроде этого:
COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStreamInit)
2. Проверь в VB! Причем нажимай F5 или создай EXE.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: ActiveX и Word.
От:
Аноним
Дата:
01.08.01 16:31
Оценка:
VD>1. Всетаки проверь наличие IPersistStream. По-моему, ATL его автоматом не добаляет. Должно быть чтото вроде этого:
VD> COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStreamInit) VD>2. Проверь в VB! Причем нажимай F5 или создай EXE.
Все есть привожу код: (ATL Wizard добавляет автоматом все кроме IPersistPropertyBag)
class ATL_NO_VTABLE CActiveBC :
......
public IPersistStreamInitImpl<CActiveBC>,
public IPersistStorageImpl<CActiveBC>,
public IPersistPropertyBagImpl<CActiveBC>,
public ICustomActiveBC
......
{
....
}
Ну, и где здесь:
COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStreamInit)
или
COM_INTERFACE_ENTRY2(IPersistStream, IPersistStreamInit)
???
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: ActiveX и Word.
От:
Аноним
Дата:
02.08.01 04:53
Оценка:
VD>Ну, и где здесь: VD>COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStreamInit) VD>или VD>COM_INTERFACE_ENTRY2(IPersistStream, IPersistStreamInit)
Да вставлял я вчера
COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStreamInit)
но только убрал потому что нет эффекта.
Re[9]: ActiveX и Word.
От:
Аноним
Дата:
02.08.01 05:02
Оценка:
Может надо что-то руками сделать. Поделитесь примером кому не жалко.
Re[10]: ActiveX и Word.
От:
Аноним
Дата:
02.08.01 08:37
Оценка:
А ведь должен собака(мать его Word) сохранять, сам видел на других контролах ?
Уже не знаю чего и придумать.
PS
Коберниченко переопределяет эти методы для сохранения строк
но если в карте свойств есть дополнительные entries, то у меня(ну не знаю...) после позиции <ССЫЛКА 1> hr (при работе с word'ом, м.б.) вовсе и FAILED со всеми вытекающими...(при работе с word'ом, м.б.)
Здравствуйте Аноним, вы писали:
А>Да вставлял я вчера А> COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStreamInit) А>но только убрал потому что нет эффекта.
А зря некоторые функции загрузки состояния умеют работать только с IPersistStream.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
При сохранении же измененного документа ни Save ни Load не вызываются.
Вот такие пироги с котятами ...
А VB кстати вызывает IPersistPropertyBagImpl::Save() при нажатии
на кнопку "Сохранить", а при "Remove Project" вызывает
IPersistStreamInitImpl::Save().
Подозрение опять таки на карту интерфейсов, но я включил в нее уже все
что можно:
Здравствуйте Аноним, вы писали:
А>Да ребята это все хорошо, но у меня метод Save вообще не вызывается.
А>Вернее он вызывается, но только при открытии документа *.doc, в следующей А>последовательности:
А>IPersistStreamInitImpl::Load() А>IPersistPropertyBagImpl::Save() А>IPersistStorageImpl::Save() А>IPersistStreamInitImpl::Save()
А>При сохранении же измененного документа ни Save ни Load не вызываются.
При открытии документа Word
— создает временный файл
— сохраняет старую копию
— сохраняет новую копию
при нажатии на кнопку с дискетой он [просто] этот временный файл переименовывает в настоящий
А>Вот такие пироги с котятами ...
А>А VB кстати вызывает IPersistPropertyBagImpl::Save() при нажатии А>на кнопку "Сохранить", а при "Remove Project" вызывает А>IPersistStreamInitImpl::Save().
VB хранит designtime свойства control'а в текстовом формате (посмотрите *.frm), поэтому использует(старается :) PropertyBag
Word хранит [вроде бы] в бинарном, поэтому достаточно PersistStream
А>Подозрение опять таки на карту интерфейсов, но я включил в нее уже все А>что можно:
А>BEGIN_COM_MAP(CActiveBC) А> ....... А> COM_INTERFACE_ENTRY(IPersistStreamInit) А> COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit) А> COM_INTERFACE_ENTRY(IPersistStorage) А> COM_INTERFACE_ENTRY(IPersistPropertyBag) А> COM_INTERFACE_ENTRY2(IPersistStream, IPersistStreamInit) А> ....... А>END_COM_MAP()
Карта нормальная
Нет. Карта кривая, но к делу это не отностся.
COM_INTERFACE_ENTRY2 — не надо применять к IPersistStream. 3-я версия ATL-а кривая и допускает такое несоответствие. В VC 7 (7-ом ATL-е) это перестанет работать. Дело в том,что IPersistStreamInit не унаследован от IPersistStream, а просто похож. По этому нужно испльзовать COM_INTERFACE_ENTRY_IID.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Слушай Аноним а ты не мог бы ради хохмы зарегистрироваться? А то даже не понятно как тебя называть. :)
Вот только что посмотрел... Действительно глючит. Но дело не в том, что когото не вызывают, а в том что у козлов из MS нехватает времени, чтобы почитать собственные специвикации!
Вызывается IPersistStreamInit в лучшем виде. И на записи все проходит, а при чтении эти критины подсовывают какойто свой диспачь. Причем они заменяют диспачь контрола. :( В этом диспаче нет наших DISPID... вот и происходит вылет. Кстати, мог бы и сам залезть в ATL-ныйе исходники...
Короче, выхода два: или делать тлько дата_энтрай (проходит если все донные которые надо сохранять простых типов (не строки и т.п.), или писать ручками как говорил Ростислав.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, вы писали:
VD>Слушай Аноним а ты не мог бы ради хохмы зарегистрироваться? А то даже не понятно как тебя называть. :)
Ну разве только ради хохмы. Тяжело применять 20..30 разных паролей:)
VD>Вот только что посмотрел... Действительно глючит. Но дело не в том, что когото не вызывают, а в том что у козлов из MS нехватает времени, чтобы почитать собственные специвикации!
VD>Вызывается IPersistStreamInit в лучшем виде. И на записи все проходит, а при чтении эти критины подсовывают какойто свой диспачь. Причем они заменяют диспачь контрола. :( В этом диспаче нет наших DISPID... вот и происходит вылет. Кстати, мог бы и сам залезть в ATL-ныйе исходники...
Где подсовывают в Load ?
Да залазил я. В Save все красиво. Сырые данные (DATA_ENTRY) пишутся сразу в
stream, остальные св-ва через IDispatch вытаскиваются в CComVariant и
тоже пишутся.
Load особо не смотрел.
VD>Короче, выхода два: или делать тлько дата_энтрай (проходит если все донные которые надо сохранять простых типов (не строки и т.п.), или писать ручками как говорил Ростислав.
Да ручками гораздо проще, чем разбираться в ихних исходниках. Да я сразу и
начал то ручками.
Но вот была проблема, что не вызывается Save, сегодня постараюсь освежить это
все в памяти напишу подробнее.
Здравствуйте Dima2, вы писали:
D>Здравствуйте VladD2, вы писали:
VD>>Слушай Аноним а ты не мог бы ради хохмы зарегистрироваться? А то даже не понятно как тебя называть. :)
D>Ну разве только ради хохмы. Тяжело применять 20..30 разных паролей:)
Там есть галочка "Запомнить меня". Нажал и забыл. Кстати сам то зарегистрировался!
А про остольное ... ну слова, слова если кому интересно могу выслать исходники, провда они по большей части авто-генеренные.
PS
D>Да ручками гораздо проще, чем разбираться в ихних исходниках. Да я сразу и начал то ручками.
Да, ... ну что тут скажешь... проффесиональный взгляд...
Поспорили как то Американцы и Русские у кого армия ленивей...
Построили взвод американцев.
Командуют — "Ленивым выйти из строя".
Ну, все, кроме одног, сделали шаг в перед.
Построили взвод русских.
Командуют — "Ленивым выйти из строя".
Все стоят.
Командит орет
— Еще раз повторяю, ленивым выйти из строя.
Все стоят.
Командир взмаливается.
Иванов ну ты, что себя ленивым не считаеш?
Ну, считаю тов.ком., что же теперь из-за этого в такую даль переться?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, вы писали:
VD>А про остольное ... ну слова, слова если кому интересно могу выслать исходники, провда они по большей части авто-генеренные.
Ф-я Save все-таки не вызывалась, т.к. IsDirty возвращал E_FAIL (не надо сохранять данные). После изменения своих св-в вручную вызываю
SetDirty(TRUE) или можно m_bRequiresSave = 1;. Может кто-то автоматом
должен вызывать SetDirty() ?
Сохранение св-в делаю руками, т.к. при загрузке и сохранении данных
действительно вылазит какой-то непонятный IDispatch, хотя откуда он
берется ?
Карта св-в сохраняется нормально только для "сырых" св-в (PROP_DATA_ENTRY),
если же св-во необходимо получать через IDispatch (PROP_ENTRY), то ошибка.
Может кто знает чего вылазит странный IDispatch в Load и Save ?
Я пробовал сам получить IDispatch внутри своего компонента, тоже
вылазит чужой, если получаю IDispatch из другой программы, то
все в порядке ???
Здравствуйте Dima2, вы писали:
D>Ну вроде поборол эту заразу.
D>Ф-я Save все-таки не вызывалась, т.к. IsDirty возвращал E_FAIL (не надо сохранять данные). После изменения своих св-в вручную вызываю D>SetDirty(TRUE) или можно m_bRequiresSave = 1;. Может кто-то автоматом D>должен вызывать SetDirty() ?
SetDirty(TRUE);
Будет культурнее, чем "m_bRequiresSave = 1" и ни когда не повредит.
D>Может кто знает чего вылазит странный IDispatch в Load и Save ? D>Я пробовал сам получить IDispatch внутри своего компонента, тоже D>вылазит чужой, если получаю IDispatch из другой программы, то D>все в порядке ???
Ну, нормальные Ax-контейнеры должны подменять диспач для реализации таких свойств как:
Name, Left, Top...
Но при встраивании контролов непосредственно в документ в MS лажанулись. Видима агрегируют криво. В том же Ворде, но в формах все (вроде) нормально.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Dima2, Вы писали:
D>Ну вроде поборол эту заразу.
D>Ф-я Save все-таки не вызывалась, т.к. IsDirty возвращал E_FAIL (не надо сохранять данные). После изменения своих св-в вручную вызываю D>SetDirty(TRUE) или можно m_bRequiresSave = 1;. Может кто-то автоматом D>должен вызывать SetDirty() ?
D>Сохранение св-в делаю руками, т.к. при загрузке и сохранении данных D>действительно вылазит какой-то непонятный IDispatch, хотя откуда он D>берется ?
D>Карта св-в сохраняется нормально только для "сырых" св-в (PROP_DATA_ENTRY), D>если же св-во необходимо получать через IDispatch (PROP_ENTRY), то ошибка.
D> PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4) D> PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4) D>// PROP_ENTRY("AlignText", 1, CLSID_NULL)
D>Да конечно сохранение руками немного некрасиво и объемно по тексту D> .......... D> hr = var.ReadFromStream(pStm); D> put_ShowText(var.boolVal);
D> hr = var.ReadFromStream(pStm); D> put_CalcCheck(var.boolVal); D> ..........
D>Может кто знает чего вылазит странный IDispatch в Load и Save ? D>Я пробовал сам получить IDispatch внутри своего компонента, тоже D>вылазит чужой, если получаю IDispatch из другой программы, то D>все в порядке ???
Я извиняюсь что возвращаюсь к своим старым баранам, но в MSDN нашел
другое решение этой проблемы. Если кому интересно:
PRB: ATL Control Properties Do Not Persist when Embedded in Word
ID: Q241936
Оказалось дейсвительно WORD подсовывает другой IDispatch. Все
контролы Word заворачивает еще в свои обертки и при QueryInterface
подсовывает IDispatch обертки, а не контрола.
Кстати в Word(XP) такого нет.
А вообще грустно все это. Чем больше работаю с ActiveX, тем
больше разочаровываюсь, и прихожу к выводу что чтобы заставить
работать контрол так как задумано надо самому написать контейнер
к нему
Сейчас появились проблемы с 1С — Не показывается окно св-в контрола,
хотя 1С фокус теряет
Здравствуйте Dima2, Вы писали:
D>Я извиняюсь что возвращаюсь к своим старым баранам, но в MSDN нашел D>другое решение этой проблемы.
Зря ты извиниешся. Так и нужно поступать. Нашол решение сам... раскажи о этом другим.
D>Кстати в Word(XP) такого нет.
Интересно, а как они подсовывают расширенные свойства? Не угробили ли они что нибудь другое исправляя эту ошибку?
D>А вообще грустно все это. Чем больше работаю с ActiveX, тем D>больше разочаровываюсь, и прихожу к выводу что чтобы заставить D>работать контрол так как задумано надо самому написать контейнер D>к нему
Когда "самом напишеш контейнер", то загрустишь еще больше. Поверь, мы это уже сделали.
D>Сейчас появились проблемы с 1С — Не показывается окно св-в контрола, D>хотя 1С фокус теряет
А что за всерь "окно св-в контрола"? Страницы свойств что ли?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
D>>Сейчас появились проблемы с 1С — Не показывается окно св-в контрола, D>>хотя 1С фокус теряет
VD>А что за всерь "окно св-в контрола"? Страницы свойств что ли?
Да.
Кстати до OnInitDialog ни одной из страниц дело не доходит.
Не знаю как подступиться, чтобы понять где затыкается.
Может вынести в отдельную тему ActiveX и 1С
Здравствуйте Dima2, Вы писали:
D>>>Сейчас появились проблемы с 1С — Не показывается окно св-в контрола, D>>>хотя 1С фокус теряет
VD>>А что за всерь "окно св-в контрола"? Страницы свойств что ли?
D>Да. D>Кстати до OnInitDialog ни одной из страниц дело не доходит. D>Не знаю как подступиться, чтобы понять где затыкается. D>Может вынести в отдельную тему ActiveX и 1С
Тогда нужно смотреть как 1С пытается запросить у тебя информацию о "Страницах свойств".
PS
А он вообще умеет показывать Страницы свойств (ну, у других контролов)?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.