Antonariy
Я может чего не так сформулировал, но то, что ты написал, я как раз правильно понимаю. В интерфейсе все процедуры пустые. После того, как я его имплементю и реализую, мой класс становится опозноваемым снаружи - он теперь соответсвует нужным правилам, и по этим правилам к нему теперь можно обращаться.
Интерфейсы ничего не возвращают
В IContextMenu2 реализуется процедура:
Private Sub IContextMenu2_HandleMenuMsg(ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
End Sub
Через которую проводник мне возвращает нужные значения. Может, слово "возвращает" здесь не вполне подходит, но я это имел ввиду.
Кстати, пока не увидил этот присловутый IContextMenu2, мне казалось, что через него мне дадут хендл для субклассинга. А оказалось, что субклассинг происходит где-то там за кулисами, а мне возвращают уже готовые сообщения. Это, кстати, означает, что с помощью IContextMenu2 я смогу только подровнять пункты, но чтобы самому их перерисовывать, нужен IContextMenu3. А его я так и не нашёл.
Найдя все эти классы, он у каждого запрашивает интерфейс IContextMenu. Если интерфейс получен, добавляется пункт, если нет, игнорируется.
Э-эх, если бы было всё так просто... Тогда
Implements IContextMenu2 было бы достаточно. Но увы:
Бейсик то ли не может самостояетльно реализовать QueryContextMenu, то ли делает это как-то не так, то ли ещё чего (не силён в инглише, в связи с чем комментарии не очень понял). Поэтому при инициализации класса делается такая фишка:
- Код: Выделить всё
Dim pImp As Long
Dim oImp As IContextMenu
Set oImp = Me
Call CopyMemory(pImp, oImp, 4)
pOldFunction = ReplaceVtableEntry(pImp, 4, AddressOf sc_QueryContextMenu)
И после этого всё, что должно было бы прийти в IContextMenu_QueryContextMenu, перенаправляется в sc_QueryContextMenu.
Логика этого способа мне не вполне понятна. Проделать то же самое для IContextMenu2 мне не удалось (не заработало).
И вообще, начни с изучения основ технологии COM
Внятно по-русски для бейсика ничего нет. А других языков (кроме русского и бейсика) я не знаю