Вставляю 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>Да ручками гораздо проще, чем разбираться в ихних исходниках. Да я сразу и начал то ручками.
Да, ... ну что тут скажешь... проффесиональный взгляд...
Поспорили как то Американцы и Русские у кого армия ленивей...
Построили взвод американцев.
Командуют — "Ленивым выйти из строя".
Ну, все, кроме одног, сделали шаг в перед.
Построили взвод русских.
Командуют — "Ленивым выйти из строя".
Все стоят.
Командит орет
— Еще раз повторяю, ленивым выйти из строя.
Все стоят.
Командир взмаливается.
Иванов ну ты, что себя ленивым не считаеш?
Ну, считаю тов.ком., что же теперь из-за этого в такую даль переться?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.