|
|
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
всем привет собственно столкнулся с проблемой об которую почти поломал мозг есть некая библиотека содержащая в себе интерфейс IFTP и классы Explorer и Connection. Я так понимаю оба класса имплементят этот интерфейс. Класс Connection имплементит также функцию Open(), класс Explorer имплементит функцию Dir(). Библиотека добавлена в референсы и имеем такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. В результате мы можем открыть соединение методом класса Connection.Open() и листануть файлы методом класса Explorer.Dir() как они там друг другу передают состояние подключения я не знаю, это что то зашитое внутри. задача - отвязаться от раннего связывания пока сделал такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. делаю так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Собственно вопрос - как это сделать и вообще в какую сторону копать? исходники библиотеки и ее авторы недоступны. спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 18:08 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
Лучше забей на это дело, иначе придется аццки хачить механизмы COM. По умолчанию отдается ссылка на базовый класс — Connection. Если ты хочешь получить другой интерфейс, ты должен сказать какой. В целях образования скорми гуглю слово VTABLE (virtual table). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 18:25 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
забить не получится, придется аццки хачить вот я собственно и ищу способ как указать какой именно интерфейс мне нужен, только сделать это надо путем использования стринговой константы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 18:42 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
Nikz, надо отвязаться от раннего связывания во всём проекте, или же от раннего связывания с этой библиотекой только? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 19:24 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
Nikzесть некая библиотека содержащая в себе интерфейс IFTP и классы Explorer и Connection. Я так понимаю оба класса имплементят этот интерфейс. Класс Connection имплементит также функцию Open(), класс Explorer имплементит функцию Dir(). Библиотека добавлена в референсы и имеем такой код: ... т.е. обьявляем expl как IFTP. Затем создаем обьект Connection и кастим его на expl. В результате мы можем открыть соединение методом класса Connection.Open() и листануть файлы методом класса Explorer.Dir() Что-то не понятная ситуация, если класс Connection не имеет метода Dir(), а интерфейс IFTP его имеет, то все-таки класс Connection нифига не импелементит этот интерфейс? Интересно было бы глянуть на сами интерфейсы и их иерархию, по-моему подобной проблемы не должно возникать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 19:55 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
junior idiotЧто-то не понятная ситуация, если класс Connection не имеет метода Dir(), а интерфейс IFTP его имеет, то все-таки класс Connection нифига не импелементит этот интерфейс?Нет, всё нормально. Кастуем Connection к IFTP и имеем Dir. Не путай поддержку интерфейса COM-объекта с наследованием реализации в классе языка, который её поддерживает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 20:15 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
БенедиктНет, всё нормально. Кастуем Connection к IFTP и имеем Dir. Не путай поддержку интерфейса COM-объекта с наследованием реализации в классе языка, который её поддерживает. Да не путаю, вроде как. "Поддержка интерфейса" разве не означает имплементацию всех объявленных в интерфейсе [и не имплементированных, хотя в "интерфейсе" только такие и есть] методов? Наследование реализации тут ни при чем, в общем-то. p.s. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 20:22 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
junior idiotБенедиктНет, всё нормально. Кастуем Connection к IFTP и имеем Dir. Не путай поддержку интерфейса COM-объекта с наследованием реализации в классе языка, который её поддерживает. Да не путаю, вроде как. "Поддержка интерфейса" разве не означает имплементацию всех объявленных в интерфейсе [и не имплементированных, хотя в "интерфейсе" только такие и есть] методов? Наследование реализации тут ни при чем, в общем-то. Вот-с, нашел. MSDNInheritance in COM does not mean code reuse. Because no implementations are associated with interfaces, interface inheritance does not mean code inheritance. It means only that the contract associated with an interface is inherited in a C++ pure-virtual base-class fashion and modified — either by adding new methods or by further qualifying the allowed usage of methods. There is no selective inheritance in COM. If one interface inherits from another, it includes all the methods that the other interface defines. Чудненько, значит все правильно я понимаю, не совсем еще моск атрофировался ;-) Таки вот и не понятно, как может кастинг к более "старшему" (в иерархии) интерфейсу "добавить" новый метод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 20:37 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
junior idiot"Поддержка интерфейса" разве не означает имплементацию всех объявленных в интерфейсе [и не имплементированных, хотя в "интерфейсе" только такие и есть] методов?Да, означает. Но, во-первых, эти обязательные к реализации методы будут private, во-вторых, иметь другие имена (добавляется префикс - имя имплементируемого класса и подчёркивание). Пример же просто ошибочный (что, если добавить Public Function Dir(), компилятор перестанет ругаться?) junior idiotНаследование реализации тут ни при чем, в общем-то.Может, и не при чём, и я ошибся, сделав такое предположение, но вопросы, схожие с твоим, как-то больше задают люди с опытом в языках с поддержкой наследования реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 20:44 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
junior idiot, inherits - наследует (один интерфейс другому) implements - реализует (COM-объект - интерфейс) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 20:47 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
junior idiot, здесь нет иерархии (вот было бы чудесно в VB поиметь все проблемы, связанные со множественным наследованием :-\), и в VB нет зарезервированного слова Inherits. Nikz, так вот, если цель - отвязаться от конкретной библиотеки, но не превращать код на VB в код на VBScript :), то см. приложенный файл. Требуется библиотека OLELIB.TLB отсюда . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 20:53 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
БенедиктПример же просто ошибочный (что, если добавить Public Function Dir(), компилятор перестанет ругаться?) Ну к очепяткам не обязательно придираться)) если Opens() заменить на Class1_Opens(), то ругаться не перестанет, и если при этом же добавить Public Function Class1_Dir() - вот тогда только и перестанет, т.е. все методы имплементируемого интерфейса обязательно надо определить, как ни крути. А вот то что их можно объявить Private (при этом сохранив доступ к имплементации в потомке через каст к предку), это интересно ;-) Бенедиктinherits - наследует (один интерфейс другому) implements - реализует (COM-объект - интерфейс) Спасибо, я в курсе; могу перефразировать: нельзя отнаследовать и не реализовать. Бенедиктjunior idiot, здесь нет иерархии (вот было бы чудесно в VB поиметь все проблемы, связанные со множественным наследованием :-\), и в VB нет зарезервированного слова Inherits. Где "здесь"? Технология СОМ, являясь более или менее кое-как основанной на ООП, имеет модель наследования, и даже множественного, а VB целиком и полностью основан на этом самом СОМ. Implements - как раз и означает, что новый класс должен полностью имплементировать интерфейс предка (что вполне себе можно называть "наследованием"), что позволяет впоследствии объекты потомка кастовать к типу предка (что дает еще больше оснований рассматривать их как родитель-потомок, т.е. как связанные отношением "наследования"). "Implements Class1 Implements Class2" Добро пожаловать в множественные проблемы наследования СОМ, перекочевавшие в VB ;-) Тут-то, наверное, проектировщиков VB и посетила мысль при имплементации методов родителя дописывать к ним имя базового класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 21:10 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Да и вообще не факт что проблема такая же (private-изация метода Dir в Connection), но попробовать можно ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2009, 21:19 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
Nikzзабить не получится, придется аццки хачить вот я собственно и ищу способ как указать какой именно интерфейс мне нужен, только сделать это надо путем использования стринговой константыНачинается все с ObjPtr(con) — этим способом ты получишь адрес vtable интерфейса Connection. Как получить адрес IFTP относительно Connection не имею представления, ищи сам. Когда найдешь этот адрес, тебе нужно будет относительно него получить адреса функций этого интерфейса, это делается по формуле pFuncPtr = pVTableHead + (nEntry - 1) * 4. Чтобы узнать порядковый номер функции, воспользуйся утилитой OleView из комплекта VS6, какой она будет по счету в idl-исходнике, такой и номер. Далее тебя подстерегает генеральная засада: единственный способ вызвать функцию по указателю в VB это CallWindowProc, о чем подробно расписано здесь . Начни поиски с прочтения этой статьи, скорее всего она отобьет охоту этим заниматься. Самый простой выход — написать библиотеку-переходник, которую и подключать поздним связыванием. Еще инфа по теме и тут немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2009, 11:03 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
Бенедикт, Спасибо, интересный пример, но в этой ситуации отвязаться от раннего связывания с библиотекой нужно вообще на всем компьютере, а не только в одном этом проекте. Antonariy, мда, это жесть, будем разбираться всем спасибо за советы, есть пища для размышлений а вообще, может быть я не в ту сторону лезу? причина по которой нужно отвязаться от раннего связывания с библиотекой заключается в том что для этой библиотеки было несколько релизов. Соответственно у кучи пользователей (сотни их) стоят разные версии библиотеки. И компилялась она судя по всему не в режиме binary compatible (могу ошибаться с названием, я с библиотеками дела мало имел), то есть GUID у разных релизов библиотеки разный. Поэтому когда когда я ставлю галку в референсах на своей машине (библиотека используется в экселевском спредшите) оно будет работать только у юзеров у которых библиотека того же релиза что и у меня. У пользователей другого релиза библиотеки референс валится, и лечится это удалением Missing Reference из списка и добавлением установленной на том компьютере. Объяснить пользователям как сделать это нереально. Самому поправить у всех тоже, так как много их, и география очень широкая. Как вариант сделать инсталлятор с какой то одной версией длл и обязать всех поставить его, но опять же тетенька бухгалтер вряд ли сможет даже запустить инсталляшку, не говоря о том что exe и msi файлы во многих почтовых программах блокируются поэтому ему надо сначала изменить расширение, а потом объяснить юзеру как поменять расширение обратно чтобы можно было запустить инсталляшку и т.д. Юзеры в массе своей умеют только открыть документ эксель и нажать на нужные кнопки... поэтому идея в том чтобы как то обойти это внутри vba кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2009, 12:00 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
мда, во огород то нагородили из-за неправильной разработки dll. делайте TLB и её уже в проект подключайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2009, 12:22 |
|
||
|
приведение типов (вопрос)
|
|||
|---|---|---|---|
|
#18+
TLB не поможет. Nikz, нужно вообще не ставить ссылок на эту либу, добавить ссылку на Microsoft Visual Basic for Applications Extensibility 5.3 (хотя наверное не обязательно), а при открытии файла выполнять ThisWorkbook.VBProject.References.AddFromFile "путь к либе". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2009, 14:34 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=36068969&tid=2160795]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
82ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 439ms |

| 0 / 0 |
