Как вставить своё подменю в меню проводника? (как у RARa)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как вставить своё подменю в меню проводника? (как у RARa)

Сообщение arthur2 » 18.03.2008 (Вт) 20:28

Очень многие программы (например, RAR) тесно встраиваются в оболочку: создають свои подменю в меню проводника, добавляют собственные вкладки в "свойства файлов" и т.д. Как такое осуществить?

Что прописать в реестре, я ещё более-менее представляю (не так сложно посмотреть, что там такие программы пишут). А вот дальше...

Кто-нибудь когда-нибудь видел действующий пример подобной программы на Бейсике? Это вообще возможно? (ведь, вроде бы, не должно быть особо сложным)

Хорошо бы какой-нибудь совсем примитивный пример вроде хелоувёлда.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 18.03.2008 (Вт) 23:34

Вполне возможно, рекомендую почитать про shell extensions. Делается хитрая AciveX DLL, которая держит спец. интерфейсы.
Изображение

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 19.03.2008 (Ср) 7:19

arthur2, Посмотри тут: http://planetsourcecode.com/vb/scripts/ShowZip.asp?lngWId=1&lngCodeId=12137&strZipAccessCode=tp%2FC121375101

P.S.
Там есть файл NewReg.txt, в нем нужно вместо {23FCFE69-A54B-11D4-8AD0-484C000107C0} написать CLSID своей библиотеки после компиляции (подробные инструкции в самом файле). Потом переименовать в *.reg и добавить в реестр.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 19.03.2008 (Ср) 10:52

keks-n Спасибо. Собственно, в этом направлении и пытаюсь рыть, но по-русски для бейсика ничегошеньки. На дельфи и сях полно примеров, но я, увы, в этом чайник... Да и в бейсике не профессор.

M.A.R.K Спасибо! Да, это работает! Но сразу же появилось куча вопросов: .tlb нужно за собой тащить? С экзешником понятно - не нужно, но сдесь, вроде, .tlb тоже прописалась как-то, и вроде без неё не работает. Если её тащить, то её тоже нужно регистрировать? А как?

Возможно ли добавлять все эти интерфейсы без .tlb? Если нет, то как создать .tlb с нужными интерфейсами?

И главное - в примере вставляется не подменю, а просто пункт. Вставляется функцией InsertMenu, так что, казалось бы, можно её же использовать с флагом MF_POPUP, но после этого код перестаёт работать.

А ещё - как всё это отлаживать? После первой же проверки библиотека намертво закрепляется - ни удалить, ни перекомпилировать (где она в памяти висит и как её оттуда убрать?) Чтобы посмотреть, как подействовало изменение кода, приходится перезагружать винду - только тогда можно перекомпелировать. А некомпелированую библиотеку, запущеную из бейсика, система не видит. Или я что-то делаю не так...

В общем, кажется, это какой-то непролазный лес.

Совместными усилиями нашлась ещё пара ссылок:
Книга по shell extensions в бейсике (увы, на инглише)
http://ebuki.lionhost.ru/filebrowser.php?path=books/OReilly/OReilly+-+Visual+Basic+Shell+Programming
Примеры к этой книге (очень много):
http://examples.oreilly.com/vbshell/

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 19.03.2008 (Ср) 11:54

arthur2 писал(а):Но сразу же появилось куча вопросов: .tlb нужно за собой тащить? С экзешником понятно - не нужно, но сдесь, вроде, .tlb тоже прописалась как-то, и вроде без неё не работает. Если её тащить, то её тоже нужно регистрировать? А как?

тащить ее с собой не надо.
arthur2 писал(а):Возможно ли добавлять все эти интерфейсы без .tlb? Если нет, то как создать .tlb с нужными интерфейсами?

В VB нет, низзя.
Весь мир матрица, а мы в нем потоки байтов!

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как вставить своё подменю в меню проводника? (как у RARa

Сообщение jangle » 19.03.2008 (Ср) 12:37

arthur2 писал(а):Кто-нибудь когда-нибудь видел действующий пример подобной программы на Бейсике? Это вообще возможно? (ведь, вроде бы, не должно быть особо сложным)


Действующий пример на PowerBASIC`е, нужно только перевести его на VB. Смотри последний код

http://bbs.vbstreets.ru/viewtopic.php?t=33843

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 19.03.2008 (Ср) 16:10

Viper
Значит, .tlb как-то вставляется в саму программу? Тогда такой вопрос: если в .tlb прорва всяких интерфейсов и объявлений, а я использую только пару-тройку, в программу попадёт вся .tlb или только то, что я использовал?

jangle
Нет, это немного не то. Это пунтк в меню, целиком прописанный в реестре и просто вызывающий нужный экзешник с нужными параметрами. А хотелось бы самому управлять добавляемым меню - чтобы и иконку можно было бы добавить и подмению (собственно, главная задача для меня сейчас - как раз подменю).

По ходу дела вопрос не в тему: а есть где в сети почитать о PowerBASIC на русском?

Возвращаясь к меню. В оригинале примера меню добавляется так:

Код: Выделить всё
        Call InsertMenu(hMenu, indexMenu, MF_STRING Or MF_BYPOSITION, idCmd, sMenuItem)
        idCmd = idCmd + 1
        indexMenu = indexMenu + 1
       
        'sMenuItem = "Another menu item"
        'Call InsertMenu(hMenu, indexMenu, MF_STRING Or MF_BYPOSITION, idCmd, sMenuItem)
        'idCmd = idCmd + 1
        'indexMenu = indexMenu + 1
       
        'etc. , etc., etc.
        '
        'Do not increment idCmd for seperators!
        'Always increment indexMenu

Я пытаюсь вместо просто пункта добавить подменю:

Код: Выделить всё
On Error Resume Next
          sbHwnd = CreatePopupMenu()
          AppendMenu sbHwnd, MF_STRING, idCmd, sMenuItem

       Call InsertMenu(hMenu, indexMenu, MF_POPUP Or MF_BYPOSITION, sbHwnd, sMenuItem)
        idCmd = idCmd + 1
        indexMenu = indexMenu + 1

после чего код перестаёт работать. Что я делаю не так?

И ещё: кроме интерфейса IContextMenu есть ещё IContextMenu2 и IContextMenu3 (с помощью них, вроде бы, как раз можно и подмени добавить и иконки рисовать), но их нет в той .tlb которая приложена к примеру. Как получить эти интерфейсы? Откуда вообще беруться эти интерфейсы и как из них собрать нужную .tlb (или где взять готовую?)
Вложения
Context Menu.zip
Оригинал примера контекстного меню
(36.89 Кб) Скачиваний: 148
Последний раз редактировалось arthur2 21.03.2008 (Пт) 0:02, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.03.2008 (Ср) 16:21

arthur2
Только то, что ты использовал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 19.03.2008 (Ср) 19:10

Хакер
Я тут посмотрел блокнотом скомпелированную программу: там зачем-то вписаны пути к обеим .tlb (OLE и та самая VbShell), причём, пути сохранены АБСОЛЮТНЫЕ! Нахрена в готовом экзешниме мои личные абслоютные пути?

Слушай, Хакер, подскажи - чего я делаю не так в этом коде? Ты же, кажется, в этом хорошо понимаешь. И как, чёрт возьми, этот Шел отлаживать? Задолбался перезагружаться, чтобы по-новой перекомпелировать.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.03.2008 (Ср) 19:30

На-до-е-ло
Скомпилированный. Как только уже не уродывали это слово.

___

Я тут посмотрел блокнотом скомпелированную программу: там зачем-то вписаны пути к обеим .tlb (OLE и та самая VbShell), причём, пути сохранены АБСОЛЮТНЫЕ! Нахрена в готовом экзешниме мои личные абслоютные пути?

Не должно быть. Скинь сюда EXE-шник.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 19.03.2008 (Ср) 22:02

Да ладно ты, не кипетись так - я вообще дисграфик. Если через неделю перечитаю - у самого иногда волосы дыбом становятся. А в только что написанном в упор не вижу даже элементарных ляпов. Давайте все вместе простим мне эту маленькую слабость. А я и в бейсике не гений - чего ж теперь, ложиться и помирать? :lol:

Вот кладу экзешник с исходником. В нём специально полная минималка, чтобы легче было разобраться. В экзешние полный путь
C:\Documents and Settings\Артур.20FEE8DFA93041F\Рабочий стол\vbshell_examples\InfoTip\Vbshell.tlb

Вообще-то, .tlb тут наверное не при чём - я посмотрел другие экзешники, иногда поподаются полные пути даже к MSVBVM60.
Вложения
экзешник без всего.zip
зачем в экзешнике абсолютные пути?
(25.07 Кб) Скачиваний: 145

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Абс. пути к project.vbp в ЕХЕ

Сообщение Wolfie » 20.03.2008 (Чт) 3:01

Хакер писал(а):
Я тут посмотрел блокнотом скомпелированную программу: там зачем-то вписаны пути к обеим .tlb (OLE и та самая VbShell), причём, пути сохранены АБСОЛЮТНЫЕ! Нахрена в готовом экзешниме мои личные абслоютные пути?

Не должно быть. Скинь сюда EXE-шник.
Мой ВБ6 тоже самое делает с ЕХЕ - везде сохранены к projectname.vbp абс.пути, так вот вопрос - чем их оттуда убирать? или можно НЕХ-редактором их попросту поменять на ахинею (пробовал, но то ли я лишнее подтер, то ли незнаю...)
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 20.03.2008 (Чт) 10:27

C:\Documents and Settings\Артур.20FEE8DFA93041F\Рабочий стол\vbshell_examples\InfoTip\Vbshell.tlb


Не обращай внимания. Это мусор, который добавляет кривой компилятор VB6. Он ни на что не влияет

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.03.2008 (Чт) 10:32

jangle, а давай ты не будешь столь явно увлекаться клеймением ненавистного тебе VB? То, что тебе нравится PB, и без того известно.
Что же касается кривости компилятора, PB не менее кривой, также как VC, GCC и прочие.
Lasciate ogni speranza, voi ch'entrate.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 20.03.2008 (Чт) 11:17

alibek писал(а):jangle, а давай ты не будешь столь явно увлекаться клеймением ненавистного тебе VB? То, что тебе нравится PB, и без того известно.
Что же касается кривости компилятора, PB не менее кривой, также как VC, GCC и прочие.


Я не говорил, что VB мне не нравится, тем более, что я использую его каждый день! Вышеописанный глюк, с добавление "мусорных хвостов" в экзешник, характерен для всех компиляторов от MS, в том числе и для VC++. Это просто очередная небрежность в реализации продуктов от MS

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 20.03.2008 (Чт) 11:22

jangle
Ты не знаешь, где можно почитать про PowerBASIC на русском?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 20.03.2008 (Чт) 11:27

arthur2 писал(а):jangle
Ты не знаешь, где можно почитать про PowerBASIC на русском?


На русском не знаю, могу подсказать только англоязычные линки

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.03.2008 (Чт) 11:38

Имена файлов исходников с путями я видел не только в компиляторах MS. Программы на дельфи точно также содержат такие хвосты. И на опенсорсных продуктах я их тоже видел, а уж они наверняка компилируются GCC, а не VC. И PB, думаю, не исключение, хотя у меня нет PB, чтобы проверить.
Lasciate ogni speranza, voi ch'entrate.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 20.03.2008 (Чт) 11:50

Возможно в других тоже есть такой мусор, в PB не разу не видел таких "хвостов". Вообще они появляются, потому что линковщик выравнивает секции PE файла на размер кратный 512/1024 байт, и свободное место заполняется мусором (по идее должно нулями). В PB вообще нет линковщика, поэтому и проблемы такой не стоит

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 20.03.2008 (Чт) 20:36

jangle писал(а):В PB вообще нет линковщика, поэтому и проблемы такой не стоит

Хммм...
А как тогда происходит процесс преобразования исходника в EXEшник? Просто афаик обычно это делается в два этапа: компиляция (создание бинарного объектного файла), а затем уже линковка (объединение всех объектных файлов, составление структуры PE файла, заполнение импорта переходниками и т.д.)...
Хотя конечно я может и неправ, я не особо глубоко изучал этот вопрос, если что не так сказал - простите, просто интересно как это у PB происходит...
Подпись проходит рефакторинг

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 20.03.2008 (Чт) 20:54

А как тогда происходит процесс преобразования исходника в EXEшник?


Объектный файл не сохраняется на диск, т.е. компилятор и линковщик функционально объеденены в один файл

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 20.03.2008 (Чт) 22:44

Уважаемые, как всеже убрать такой мусор из экзешника, если ручками, то как? Есть редкие случаи, когда нежелательны косвенные способы идентификации автора и его творения... абсолютные пути, особенно идущие через Documents And Settings могут стать такой уликой =)
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 21.03.2008 (Пт) 0:06

Wolfie
Забей в хекс-редакторе мусор какими-нибудь знаками. Только, на всякий случай, не нулями, а знакоми, допустимыми в путях.

Господа! Вам не кажется, что мы несколько отвлеклись от основной темы топика? (правда, я сам начал :scratch:

Помогите же кто-нибудь с вложенным меню!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 21.03.2008 (Пт) 17:44

Всё, сам победил!

Вероятно, проблема была вообще не в коде, а в том, что сначала CLSID перегенерировался при компиляции (победилось выставлением бинарной совместимости), а потом в закидонах отладки.

В общем, как сумел, переделал пример, чтобы вставлялся не пункт, а подменю. И добавил к пункту иконку.
Вложения
Context Menu.zip
Подменю с иконкой в контекстном меню проводника
(36.89 Кб) Скачиваний: 159
Последний раз редактировалось arthur2 21.03.2008 (Пт) 23:50, всего редактировалось 1 раз.

homeworld
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 07.12.2006 (Чт) 13:17

Сообщение homeworld » 21.03.2008 (Пт) 22:06

Спасибо, пригодится!

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 21.03.2008 (Пт) 23:56

homeworld Пожалуйста. Я там ещё чуть изменил - добавил к меню иконку.

Может, кто-нибудь знает, как присабачить интерфейс не IContextMenu, как в примере, а IContextMenu2 или IContextMenu3? На сколько я знаю, с их помощью можно самому перерисовывать меню. А то иконка инвертируется :(


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71

    TopList