powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Предпросмотр
23 сообщений из 23, страница 1 из 1
Предпросмотр
    #39899993
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть приложение - CATIA (конструкторская 3-D программа, если что)
Там есть проект на VBA
Задача - на одной из форм организовать предпросмотр файлов(.Catpart,.Catproduct,.Catdrawing) этой программы.
Как сделать это если бы это были просто картинки или офисные документы- здесь на форуме найти можно. А вот как с файлами этого типа быть?
Если в окошке открытия файла (папки)в Windows выбрать "Отображать содержимое" - то там появляются нужные картинки, значит каким-то образом должно быть можно добраться до этой функции винды и создать картинку для предпросмотра, не открывая сам файл.
Кто подскажет - можно ли это сделать и как?
...
Рейтинг: 0 / 0
Предпросмотр
    #39900002
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
не открывая сам файл.
это вряд ли - не открывая. Обычно в подобных случаях небольшой битмап для предпросмотра хранится в самом файле. Надо поискать спецификацию этого файла, если она есть в открытом доступе, конечно.
...
Рейтинг: 0 / 0
Предпросмотр
    #39900059
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

читать Adding Icons, Previews and Shortcut Menus и в округе. Это набор интерфейсов и техник, которые использует Windows Explorer в просмотра содержимого. ПредполагаеЦЦа, что те, кто хотят сделать предспросмотр в своём приложении, и те, кто делают приложения, создающие документы в своих форматах, этим соглашениям следуют.
Проблема в том, что даже для опытных программистов на C++ этот пласт технологий поднять не так просто, и потребует от нескольких дней до нескольких недель или даже месяцев, если раньше с COM и OLE не имели дела.
Если же хочеЦЦа реализовать просмотр на VBA, то придётся ещё и (если цивилизованно) изучить быстренько MIDL/ODL , развернуть его компилятор, и написать адаптированные к использованию в VBA библиотеки типов с описаниями интерфейсов.

Можно назвать этот путь "путём самурая". Это правильно с точки зрения профессионального роста (но понадобится ли этот опыт в дальнейшем?), сложно, трудоёмко, но выполнимо.

Но быть может, есть "путь ниндзя".
Shocker.Pro
это вряд ли - не открывая. Обычно в подобных случаях небольшой битмап для предпросмотра хранится в самом файле. Надо поискать спецификацию этого файла, если она есть в открытом доступе, конечно.
Поскольку CATIA писалась скорее всего правильным, с т. з. MS, способом, есть шанс, что сохранённые файлы являюЦЦа structured storage с одним или несколькими потоками презентационных данных (превьюшек в форматах DIB или WMF или EMF). И есть шанс, хотя и с применением примерно таких же средств, но сравнительно малой кровью, их из файла достать.
...
Рейтинг: 0 / 0
Предпросмотр
    #39900564
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦа
, есть шанс, что сохранённые файлы являюЦЦа structured storage с одним или несколькими потоками презентационных данных (превьюшек в форматах DIB или WMF или EMF). И есть шанс, хотя и с применением примерно таких же средств, но сравнительно малой кровью, их из файла достать.

Ну вот что-то вроде этого и хотелось бы.... А нельзя чуть более подробно? Естественно, ничего похожего я ранее не делал.
...
Рейтинг: 0 / 0
Предпросмотр
    #39900703
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Предпросмотр
    #39900764
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-то заморочился и форкнул библиотеку olelib.tlb (Edanmo's OLE interfaces & functions). Вау! Есть ещё герои.
AndrF, спасибо за наводку!

Serg197311,
а шансы, оказываеЦЦа, есть . Пробуйте.
...
Рейтинг: 0 / 0
Предпросмотр
    #39900826
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не получается зарегистрировать oleexp.tlb
У меня Win7-64 и офис 2013- 32
Это возможно в такой конфигурации?
...
Рейтинг: 0 / 0
Предпросмотр
    #39900851
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

попробуйте запустить тот же Excel от имени администратора и зарегистрировать .tlb через VBA IDE Меню\Tools\References...\Browse...
...
Рейтинг: 0 / 0
Предпросмотр
    #39900869
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Excell от имени администратора что то не получается - нет такого пункта в выпадающем меню
CATIA от имени админа запустил, CAN'T remove control already in use
через cmd.exe от имени админа пытался - не дает
...
Рейтинг: 0 / 0
Предпросмотр
    #39900883
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311
Excell от имени администратора что то не получается - нет такого пункта в выпадающем меню
О, ужас! Как найти excel.exe в файловой системе, надо рассказывать?
...
Рейтинг: 0 / 0
Предпросмотр
    #39901651
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помогло...
Could not find registered preview handler for file type.
Так может что нибудь подскажете про "путь ниндзя" :)
...
Рейтинг: 0 / 0
Предпросмотр
    #39901731
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg197311
Excell от имени администратора что то не получается - нет такого пункта в выпадающем меню
...
Рейтинг: 0 / 0
Предпросмотр
    #39901757
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311
Не помогло...
Could not find registered preview handler for file type.
Не очень вериЦЦа. Если в Windows Explorer в области предварительного просмотра содержимое файла видно, то preview handler должОн быть.
Serg197311
Так может что нибудь подскажете про "путь ниндзя" :)
Ну, начните с
Код: vbnet
1.
2.
3.
4.
5.
Private Declare Function StgIsStorageFile Lib "ole32" (ByVal FileName As String) As Long

Sub Test(ByVal FileName As String)
 Debug.Print StgIsStorageFile(StrConv(FileName, vbUnicode))
End Sub

0 - да, файл являеЦЦа structured storage, 1 - нет, другое - ошибка.

Вообще, глядя на историю формата, начинающуюся в 1980-х, уверенности нет. Тем более там какие-то parts, сборки и т. д. Приложили бы пример данных. И разрядность VBA сообщили.
...
Рейтинг: 0 / 0
Предпросмотр
    #39901787
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦа

0 - да, файл являеЦЦа structured storage, 1 - нет, другое - ошибка..

1((((((

ЦЦа
Вообще, глядя на историю формата, начинающуюся в 1980-х, уверенности нет. Тем более там какие-то parts, сборки и т. д. Приложили бы пример данных. И разрядность VBA сообщили.

У меня Win7-64 и офис 2013- 32. Сама CATIA - 64 . Файл что-то не хочет цепляться...
...
Рейтинг: 0 / 0
Предпросмотр
    #39902267
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот файл
...
Рейтинг: 0 / 0
Предпросмотр
    #39905749
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

собственно, с этим файлом всё просто: в нём действительно находиЦЦа превьюшка в формате JPEG. Начинается она, как и положено, с последовательности FF D8 FF E0, а дальше любой вменяемый декодер остановиЦЦа сам.
...
Рейтинг: 0 / 0
Предпросмотр
    #39906437
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦа
Serg197311,

собственно, с этим файлом всё просто: в нём действительно находиЦЦа превьюшка в формате JPEG. Начинается она, как и положено, с последовательности FF D8 FF E0, а дальше любой вменяемый декодер остановиЦЦа сам.

Спасибо! очень обнадеживает.
Но что это хотя бы примерно может быть за декодер и как с ним из VBA работать?
...
Рейтинг: 0 / 0
Предпросмотр
    #39906796
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

Наиболее традиционные и входящие в состав ОС функции - декодеры графических форматов - OleLoadPicture () и GdipCreateBitmapFromStream (). Если файлы CATIA небольшие и целиком могут быть помещены в оперативную память, проще так и сделать, засунув в динамический байтовый массив, и затем организовать на его основе COM-объект, поддерживающий интерфейс IStream , который потом "скормить" декодеру. Если большие, COM-объект, поддерживающий интерфейс IStream, придёЦЦа сделать самому , а не вызовом одной функции.

Короче, легче сделать пример, чем расписывать словами. Но ничего, там я там одно местечко для реализации вам оставил, чтобы жизнь мёдом не казалась :).
...
Рейтинг: 0 / 0
Предпросмотр
    #39908821
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЦЦа,

все получилось, спасибо!
Один вопрос - на качество картинки как-нибудь повлиять можно?
...
Рейтинг: 0 / 0
Предпросмотр
    #39908831
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serg197311,

пожалуйста. Что записано, то и показано. Если есть опции со стороны приложения, крутите их. Либо же приводите другой пример.
...
Рейтинг: 0 / 0
Предпросмотр
    #39908836
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Serg197311
не открывая сам файл.
это вряд ли - не открывая.
тоже самое, что продегустировать пиво, не открывая банку...
...
Рейтинг: 0 / 0
Предпросмотр
    #39908946
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
Shocker.Pro
пропущено...
это вряд ли - не открывая.
тоже самое, что продегустировать пиво, не открывая банку...

А что имеется ввиду под "продегустировать"? Если определить сорт и оценить качество - то вполне можно
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Предпросмотр
    #40047670
Serg197311
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему.
Почему то, довольно часто OleLoadPicture не срабатывает - ошибки нет, картинки нет
Код: vbnet
1.
2.
lResult = OleLoadPicture(oStream, UBound(bPicData) - LBound(bPicData) + 1, _
                          TRUE_BOOL, IID_IPictureDisp, LoadPictureFromByteArray)


Вот так идет вызов. На входе
"oStream" - объект есть, через окно WATCHES - No variables
"UBound(bPicData) - LBound(bPicData) + 1"= 194611
"TRUE_BOOL"=1
"IID_IPictureDisp" - отображается, долго писать что именно(да и не надо, позже станет понятно)
"LoadPictureFromByteArray"=Nothing
На выходе
"lResult"=0
"LoadPictureFromByteArray"-отображается, Value=1208288741
В итоге - картинку видно - все ок
Далее, другой файл, на входе
"oStream" - то же самое
"UBound(bPicData) - LBound(bPicData) + 1"= 379068 бывает, что и со значительно большей цифрой картинка есть
"TRUE_BOOL"=1
"IID_IPictureDisp" - точно так же ка было выше, без отличий
"LoadPictureFromByteArray"=Nothing
На выходе
"lResult"=0
"LoadPictureFromByteArray"-отображается, Value=-553319427
В итоге - картинка пустая.
Где собака порылась?
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Предпросмотр
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]