Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизInterface Найти похожие ветки
← →
Dragon21 (2004-09-30 14:28) [0]Привет всем. У меня есть IInterface который я получаю из DLL (чужой), мне требуется его сохранить в stream. У полученного интерфейса такого метода нет, я делал преобразование в IDockManager, у него есть метод SaveToStream. Но при выполнении этого метода падает DLL. Я понимаю что при преобраховании передается только pointer. Но как это обойти не знаю. Может кто сталкивался с подобной проблемой, поделитесь как можно решить эту проблему?
← →
Суслик © (2004-09-30 14:32) [1]
> Но как это обойти не знаю. Может кто сталкивался с подобной
> проблемой, поделитесь как можно решить эту проблему?
Именно с такой я не сталкивался. Но могу предположить, что очевиден тот факт, что преобразовывать IInterface к IDockManager можно только, если объект, реализующий, IInterface реализует и IDockManager.
У тебя есть информация о том, что объект реализует также IDockManager?
← →
Dragon21 (2004-09-30 14:39) [2]Нет к сожалению у меня такой информации, в полученном интерфейсе точно нет такого метода как сохранение в stream, вот и пытался как нибудь привести к интерфейсу с таким методом. Ничего не получилось. Может есть другой способ?
← →
Суслик © (2004-09-30 14:42) [3]
> [2] Dragon21 (30.09.04 14:39)
Если интерфейс не предоставляет тебе информацию о данных, к которым он собственно доступ и организует, или ты не знаешь какие другие способные к сохранению в поток интерфейсы реализует объект, то у тебя ничего не выйдет.
← →
Dragon21 (2004-09-30 14:45) [4]Это DLL из Visual Source Safe, каждый файл там реализован в виде интерфейса, там история изменений и еще много чего. Вот этот интерефейс и хотелось слить в поток. Вот только способ найти не могу.
← →
Суслик © (2004-09-30 14:48) [5]
> Вот только способ найти не могу.
Тебе надо искать доку на тему какие еще интерфейсы поддерживает объект, лежащий под полученным тобой интерфейсом.
ЗЫ. Именно в COM я не спец. Интерфейсами регуларно пользуюсь, но для своих целей. Вполне возможно, что в COM по интерфейсу можно понять, какие еще интерфейсы он поддерживает. Я это не знаю.
← →
Dragon21 (2004-09-30 14:49) [6]Моя задача сохранить этот интерфейс, если просто сохранить имя, то потом найти его будет сложно, поэтому и хотелось иметь сразу этот интерфейс, чтобы быстро получить доступ к этому объекту.
← →
Суслик © (2004-09-30 14:55) [7]
> [6] Dragon21 (30.09.04 14:49)
Извини, но ты не очень понимаешь о чем говоришь. Без обид.
Интерфейс сохранить нельзя. У интерфейса ничего нет (нет данных). Он всего лишь интерфейс. Данные содержатся в объекте, к которому предоставляется этим интерфейсом доступ. Если тебе интерфейс ничего не говорит о данных объекта, то у тебя нет шансов его заставить это сказать. Но часто бывает так, что один объект реализует фигову тучу интерфейсов. Некая бибилиотека предоставляет тебе один интерфейс. Но ты можешь его преобразовать к другому. Но ты должен знать к какому! Откуда знать? Из документации. Ищи.
ЗЫ.
В свете твоего поста [6] у меня возникло ощущение, что тебе лучше подробней описать задачу :))
← →
Dragon21 (2004-09-30 15:03) [8]Если бы знал не спрашивал бы:-) Так что обид никаких.
можно и подробнее. Изменяется файл, в VSS, мне нужно сохранить его в базе, чтобы затем прочитать на другом компе именно эту версию, для того, чтобы запустить автоматическую сборку проекта. Возможно я пошел совсем не по тому пути, и сохранять надо по каким то другим признакам, просто с тупую сохранять имя, а потом прокручивать все дерево для его поиска очень не хочется, но если не найду другого способа, буду делать именно так. Попытка найти файл сразу по имени, мне тоже не удалась, так как приходится прокручивать все дерево VSSа и проверять имя файла и его путь. хочется более оптимальное решение.
← →
Суслик © (2004-09-30 15:05) [9]Я вот, что не понимаю, что значит фраза
"а потом прокручивать все дерево для его поиска очень не хочется"
Где прокручивать? На другом компе? Так там есть уже данные?
Если нет, что что прокручивать?
← →
Суслик © (2004-09-30 15:07) [10]В общем то совет я тебе уже дал - ищи доку к библиотеке, которой пользуешься. Целенаправленно ищи информацию о других интерфейсах, которые реализуют объекты.
← →
Dragon21 (2004-09-30 15:43) [11]Да много всего уже нашел, просто наверное это тупиковая ветвь решения, надо искать другое.
← →
Суслик © (2004-09-30 15:47) [12]
> просто наверное это тупиковая ветвь решения
Пока не исчерпаешь источники информации о реализуемых интерфейсах утверждать так нельзя.
← →
Digitman © (2004-09-30 15:58) [13]
> Dragon21
эта библиотека, надо понимать, реализует OLE/COM-сервер автоматизации ? если так, то как правило разработчик поставляет библиотеку типов, включенную либо в тело самой библ-ки (в виде ресурса TYPELIB) либо в виде отдельного одноименного файла с расширением TLB
и в том и в ином случае библиотека типов может быть просмотрена, например, утилитой OleView (из состава MS VisStudio) на предмет детального изучения интерфейсов, предоставляемых сервером, как правило нормальный разработчик для каждого метода помещает краткое его описание (и описание параметров)
← →
Суслик © (2004-09-30 16:03) [14]В добавку к [13]
можешь сам импортировать библиотеку типов. См. project\import type library
← →
Суслик © (2004-09-30 16:05) [15]
> [13] Digitman © (30.09.04 15:58)
А разве обзана бибилиотека типов или OleView показывать все реализованные объектами интерфейсы?
Например, если я делаю com с интерфейсом IMyInt, но реализую у объекта кроме IMyInt еще IStream, разве бибилиотека типов или OleView покажет, что мой объект еще поддерживает IStream?
← →
Digitman © (2004-09-30 16:10) [16]
> Суслик © (30.09.04 16:05) [15]
а как же тогда обращаться к интерфейсу, если он не описан в библиотеке ? как ты себе это видишь ?
← →
Суслик © (2004-09-30 16:12) [17]
> [16] Digitman © (30.09.04 16:10)
>
> > Суслик © (30.09.04 16:05) [15]
>
>
> а как же тогда обращаться к интерфейсу, если он не описан
> в библиотеке ? как ты себе это видишь ?
Плохо вижу. Потому и спрашиваю:)))
Т.е. все реализуемые интерфейсы (пусть даже не мои) должны быть описаны в библиотеке?
← →
Digitman © (2004-09-30 16:23) [18]
> Т.е. все реализуемые интерфейсы (пусть даже не мои) должны
> быть описаны в библиотеке?
я такого не говорил
могут быть описаны, но не обязаны
отсутствие же такой инф-ции, равно как собственно и самой библ-ки типов, afaik, не позволит использовать стандартный маршаллинг
← →
Суслик © (2004-09-30 16:24) [19]
> отсутствие же такой инф-ции, равно как собственно и самой
> библ-ки типов, afaik, не позволит использовать стандартный
> маршаллинг
Это у нас Romkin спец по этому. Хорошо бы внес ясность.
ЗЫ. Про "могут" я уже потом прочел.
← →
Dragon 21 (2004-09-30 16:48) [20]Библиотеку я импортировал, с этим проблем нет, я из своей программы могу с файлом делать все, что заложено в стандартном VSS (одно только не получилось, но с этим я разберусь), просто мне в базе нужно хранить объект, который изменили, а потом уже с ним работать, вот это у меня пока не получилось. И все доступные методы я тоже нашел, к сожалению того, что мне надо, там нет. Буду придумывать другое решение.
← →
Digitman © (2004-09-30 16:57) [21]
> Dragon 21
а какие проблемы-то ? даже если нет ничего похожего на SaveToStream, реализовать такую процедуру самому вовсе не сложно - достаточно последовательно записать в поток значения тех свойств интерфейсного объекта, которые требуется сохранять
← →
Суслик © (2004-09-30 16:58) [22]
> [21] Digitman © (30.09.04 16:57)
> а какие проблемы-то ? даже если нет ничего похожего на SaveToStream,
> реализовать такую процедуру самому вовсе не сложно - достаточно
> последовательно записать в поток значения тех свойств интерфейсного
> объекта, которые требуется сохранять
Сохранить проблем никаких. А вот восстановить :)))
Не факт, что удасться пересоздать интерфейс из файла. Или этого и не требуется?
← →
Dragon 21 (2004-09-30 17:03) [23]Возможно так и стоит сделать, просто я пока не знаю как, там в основном методы, а свойств, очень мало, и боюсь что для получения к нему доступа, этого будет не достаточно, хотя утверждать пока не проверишь, глупо, вначале надо попробовать.
← →
Digitman © (2004-09-30 17:04) [24]
> Суслик © (30.09.04 16:58) [22]
я вообще не понял из фразы
> если просто сохранить имя, то потом найти его будет сложно
что такое "имя интерфейса" и почему "потом найти его будет сложно" ... попросту не работал с VSS
← →
Суслик © (2004-09-30 17:06) [25]
> [24] Digitman © (30.09.04 17:04)
>
> > Суслик © (30.09.04 16:58) [22]
>
>
> я вообще не понял из фразы
Я имел в виду, что сохранить в поток можно (если интерфейс предоставляет доступ ко все нужным значениям). Но, как я понял, автору нужно получить на удаленной машине точно такой же интерфейс с теми же значенями. Вот в этом проблемы будут.
← →
Dragon21 (2004-09-30 17:10) [26]Как раз основная проблема и состоит в том, чтобы восстановить:-)
а по поводу фразы, у интерфейса можно получить путь и имя файла, не интерфейса, только потом придется пробегать по всему дерефу файлов, брать объект, и сверять, толи это имя или нет, по времени это будет проблематично.
← →
Суслик © (2004-09-30 17:13) [27]
> по времени это будет проблематично.
А ты проверь.
Может не все так плохо.
← →
Dragon21 (2004-09-30 17:15) [28]С восстановлением действительно проблемы, нельзя этому интерфейсу устанавливать свои значения, взять пожалуйста, а вот присвоить, не позволяет. Только глобальное присвоение типа iVSSItem:=блаблабла... а например iVSSItem.Versions:=ля ля, не работает...
← →
Суслик © (2004-09-30 17:17) [29]
> [28] Dragon21 (30.09.04 17:15)
У тебя проблема не только с присвоением, но и с создание интерфейса.
Кто у тебя будет его инстанцировать? Какая фабрика классов?
← →
Dragon21 (2004-09-30 17:18) [30]ТО [27]
Придется проверять и делать, другое решение все равно в голову не приходит.
← →
Dragon21 (2004-09-30 17:20) [31]С созданием никаких проблем, это делается легко. Есть такие возможности.
← →
Dragon21 (2004-09-30 17:21) [32]Забыл добавить, только создается он пустой. Без каких либо значений.
← →
Dragon21 (2004-09-30 18:03) [33]Всем спасибо, я нашел другое решение, которое оказалось на столько простым, что даже стыдно стало, что сразу не сделал, но как известно на ошибках учатся, жаль что на своих:-)
← →
Суслик © (2004-09-30 18:06) [34]
> [33] Dragon21 (30.09.04 18:03)
Рассказал бы.
Думаю мы этого достойны :))))
← →
Dragon21 (2004-09-30 18:30) [35]Расскажу, думаю это действительно будет правильно.
Как я и думал, это направление оказалось тупиком, но есть более интересное решение, которое можно было получить, если не упираться именно, в задачу сохранения интерфейсов. Каждый из них, имеет свой уникальный идентификатор, передав который на уровень другого объекта, можно было получить требуемый интерфейс, то есть та самая проблема восстановления сошла на нет, все оказалось просто. Достаточно сохранить идентификатор, а потом передать его на уровень базового класса. Примерно получилось так VSSDataBase.GetItem(identifier). Утрирую конечно, но общий смысл такой. Всем большое спасибо. Ваши советы помогли поискать более простое и элегантное решение. А то я зациклился на одном месте, такое к сожалению бывает.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.048 c