|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Ну собственно решил создать новую тему из этой: Вызов стандартного окна загрузки IE т.к. постановка вопроса изменилась. Сразу объясню почему меня не устраивает раннее связывание в .Net. При добавлении ссылки на COM .Net создает обертку. Эта обертка под конкретную версию COM, версию .Net (в этом духе). Стоит поменять .Net -версию проекта, изменить битность кода (x86/x64), перенести exe на другую машину/OS где другая версия COM dll, и все развалится с ошибкой типа: Невозможно загрузить файл или сборку "Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Сборка создана в более поздней версии среды выполнения чем текущая, и не может быть загружена. В то же время позднее связывание (CreateObject) этим дефектом не страдает. Т.е. есть код через раннее связывание: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Переписываем его через позднее связывание: Код: vbnet 1. 2. 3. 4. 5. 6.
Но вот как мне в нижнем варианте кода отловить события? Есть какие-то общие решения? Пара комментов. 1. Для указанного частного случая с COM-объектом InternetExplorer.Application есть типа .Net-замена - WebBrowser - класс . Но я уже его исследовал и пришел к выводу, что он не делает то что мне нужно и так как нужно. 2. Для этого примера с InternetExplorer.Application с обработкой событий можно и забить. Но мне в дальнейшем при миграции моего проекта понадобится к примеру другой системный COM: Microsoft Fax Service Extended COM Type Library (fxscomex.dll). И вот там без событий никак. Т.е. мне нужно какое-то общее решение для COM + Позднее связывание + События. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 14:50 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77Сразу объясню почему меня не устраивает раннее связывание в .Net. не нужно объяснять Дмитрий77Т.е. мне нужно какое-то общее решение для COM + Позднее связывание + События. оно существует. влом искать, можно просто посмотреть на говнокод, генеримый студией (любым рефлектором), там много забавного ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 15:40 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Изопропилоно существует. влом искать, Хорошо если существует. Мне не влом искать. Искал в google по словам типа "late binging withevents vb.net" и им подобным. Толком ничего так и не нашел. Пытался также решить эту задачу в VB6 (хотя там это не надо - VB6 в этом плане умнее: он при раннем связывании автоматически использует последнюю версию COM имеющуюся на данном компе). Изопропилможно просто посмотреть на говнокод, генеримый студией (любым рефлектором), там много забавного Не очень понимаю что ты имеешь ввиду и что надо делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 16:02 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77, 1) ищи примеры на C# 2) добавь к проекту ссылку на COM, рефлектрором изучи сгенерённую сборку ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 16:16 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Изопропил, >ищи примеры на C# чет не нахожу ни на C#, ни на чем другом Вот нашел: WithEvents and Late Binding Попробовал: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
(ругается на выделенной строчке, т.е. не может событие таким макаром найти) >добавь к проекту ссылку на COM, рефлектрором изучи сгенерённую сборку Ну скачал я какой-то ILSpy Открыл файл Interop.SHDocVw.dll Написано там: using System; using System.Reflection; using System.Runtime.InteropServices; using System.Security; [assembly: AssemblyVersion("1.1.0.0")] [assembly: Guid("eab22ac0-30c1-11cf-a7eb-0000c05bae0b")] [assembly: ImportedFromTypeLib("SHDocVw")] [assembly: TypeLibVersion(1, 1)] [assembly: SecurityRules(SecurityRuleSet.Level2)] Это я и блокнотом где-то видел. Что именно я должен этим рефлектором смотреть? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 17:09 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Я вот еще поискал, состряпал такой код: Код: vbnet 1. 2. 3. 4. 5.
(работает) Полагаю это универсальный для VB.Net и C# путь имплементации позднего связывания. И подозреваю что это путь верный (м.б.). Но пока не врубаюсь как прицепиться к событиям. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 18:12 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77Я вот еще поискал, состряпал такой код: Код: vbnet 1. 2. 3. 4. 5.
(работает) Полагаю это универсальный для VB.Net и C# путь имплементации позднего связывания.Ничем не отличается от Код: vbnet 1. 2. 3.
а так же Код: vbnet 1.
Те же яйца, только через развесистую объектную модель. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 18:31 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Antonariy, Ну я вот еще нашел. Receiving Events from late-bound COM servers Вроде по теме. Но там C# и не совсем понимаю как и чего делать применительно к VB.Net. Мне весь набор событий не нужен. Как правило нужно всего несколько. В примере с IE всего 2 из полного набора. Рефлектрор взял как Изопропил советовал, ну какой-то C# код вижу (похожий на пример), а вот чего делать не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 18:52 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77, древний пример для ворда - http://www.codeproject.com/KB/cs/zetalatebindingcomevents.aspx?display=Print ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 18:57 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Изопропил, Ага. Ты не заметил, что ссылка данная тобой совпадает со ссылкой приведенной мной постом выше? Заумно все очень. Нужен какой-то простой пример именно на VB.Net а не на C#. Вроде вот нашел еще: https://social.msdn.microsoft.com/Forums/vstudio/en-US/2b2bbda7-02e9-49d9-be51-f07dc02881d3/latebound-event-sink-works-with-word-not-with-outlook-why?forum=vsto Там для VB.Net. Но все равно заумно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 19:06 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77Изопропил, Ага. Ты не заметил, что ссылка данная тобой совпадает со ссылкой приведенной мной постом выше? Заумно все очень. Нужен какой-то простой пример именно на VB.Net а не на C#. Вроде вот нашел еще: https://social.msdn.microsoft.com/Forums/vstudio/en-US/2b2bbda7-02e9-49d9-be51-f07dc02881d3/latebound-event-sink-works-with-word-not-with-outlook-why?forum=vsto Там для VB.Net. Но все равно заумно.Ничего сложного, лишь воды много. Сделай поиск по IApplicationEvents2. Фишка в том, чтобы создать аналог этого интерфейса: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Твой гуид: 0002DF01-0000-0000-C000-000000000046 DispId(2) - число означает порядковый номер члена в таблице экспорта, этот номер можно узнать, ковырнув tlb веббраузера и посчитав порядковые номера FileDownload и NavigateError в их группе. Если вкратце, то ты тут как бы объявляешь кусок com-интерфейса IE, полностью соответствующий оригиналу, и тем самым фактически имеешь раннее связывание, сделанное своими руками через минимально необходимый интерфейс. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 19:31 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77Но все равно заумно. всё как в старом COM без .net источник событий реализует IConnectionPointContainer у него запрашивffют IConnectionPoint ( здесь нужно знать Guid интерфейса событий ) далее - подписаться у полученной СonnectionPoint на события. Дмитрий77весь набор событий не нужен. Как правило нужно всего несколько это никого не интересует, придётся реализовать все, что не проблема- интерфейс из рефлектора извлекается - реализация минутное дело. Некий гимор могут параметры- интерфейсы представлять, их можно заткнуть просто [MarshalAs(UnmanagedType.IUnknown)] object чтоб не тащить описания ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 19:39 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
меня одного этот Дмитрий 77 раздражает? тут тебе ни кто, ни чем не обязан ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 19:51 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Roman Mejtesменя одного этот Дмитрий 77 раздражает?Разражает - не читай, проблема-то? Мыши колятся, но продолжают есть кактус? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 19:53 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Shocker.ProМыши колятся, но продолжают есть кактус? это не вопрос, а утверждение. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 20:57 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Изопропил,Antonariy Спасибо огромное за подсказки. Завелось таки наконец! Вот код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59.
Нечего не упустил? ИзопропилДмитрий77весь набор событий не нужен. Как правило нужно всего несколько это никого не интересует, придётся реализовать все, что не проблема- интерфейс из рефлектора извлекается - реализация минутное дело. Некий гимор могут параметры- интерфейсы представлять, их можно заткнуть просто [MarshalAs(UnmanagedType.IUnknown)] object чтоб не тащить описания Все-таки "все" реализовывать не надо. Достаточно только тех двух-трех что нужны. ===== Roman Mejtesменя одного этот Дмитрий 77 раздражает? тут тебе ни кто, ни чем не обязан ТЫ мне ничем не обязан, как и никто другой из присутствующих. Но меня лично раздражает когда люди начинают извините откровенно срать в чужом топике не по теме, да еще и с переходом на личности, в то время как по теме им сказать (предположительно) нечего. Я тебя таймером обидел? Извини если так, но там ничего личного не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2015, 22:49 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Не любитель писать классы, но здесь наверно лучше выносить в отдельный. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2015, 01:02 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77Все-таки "все" реализовывать не надо. Достаточно только тех двух-трех что нужны. от COM- сервера зависит. некоторым не очень нравится несоблюдение контракта(в общем случае) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2015, 11:00 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77Все-таки "все" реализовывать не надо. Достаточно только тех двух-трех что нужны. от COM- сервера зависит. некоторым не очень нравится несоблюдение контракта(в общем случае) Что значит "несоблюдение контракта"? Все-таки переписывать всю модель COM-компонента для простой задачки это круто. И потом (в приведенном примере например) там кроме InternetExplorer еще куча объектов. Или речь идет об отдельно взятом интерфейсе (DWebBrowserEvents2 для этого примера)? Потом если ты декларируешь функцию события в интерфейсе, то ее обязательно надо прописывать в классе, который этот интерфейс использует -куча пустышек или куча невостребованных RaiseEvent. В примере с Word тоже не все ф-ции переписаны вроде (не в C#-ном а в VB.Net примере -я приводил ссылку). К счастью я эти COM редко использую, и еще реже с событиями. В VB6 я откровенно недолюбливал OCX-ы. Дойду вот до этого Fax Service Extended COM Reference -уже тогда буду смотреть. В VB6 у меня раннее связывание, которое никогда не подводило, начиная с XP и кончая 8.1. ADODB еще понадобится (там правда достаточно максимальную версию указать при раннем связывании). Но там без событий. Кстати для x64 кода эта кухня предполагаю не заведется. Счас главное было понять принцип. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2015, 15:08 |
|
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
|
|||
---|---|---|---|
#18+
Дмитрий77ADODB еще понадобится контракт - заявил подписчик, что реализует ConnectionEvents (00001400-0000-0010-8000-00AA006D2EA4) - значит реализует полностью если подписаться на события Connection и не реализовать WillConnect - Open завершится неудачей Почему работает неполная реализация - события вызываются одиннхер через IDispatch, а офис и эксплорер спокойно относятся к тому, что клиент не обеспечил обработку всех событий Дмитрий77Потом если ты декларируешь функцию события в интерфейсе, то ее обязательно надо прописывать в классе, который этот интерфейс использует -куча пустышек при раннем связывании именно такие пустышки и генерятся - вот оттуда и можно их стащить. заодно поправить типы параметров, бывает что кривенько работает импорт (одиночный указатель вместо массива, строка не того типа и т д) или просто достаточно IntPtr получить , а не структуру или интерфейс ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2015, 15:49 |
|
|
start [/forum/moderation_log.php?user_name=valik65]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 762ms |
total: | 913ms |
0 / 0 |