Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно? / 20 сообщений из 20, страница 1 из 1
08.02.2015, 14:50
    #38874161
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Ну собственно решил создать новую тему из этой:
Вызов стандартного окна загрузки 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.
Imports SHDocVw 'Microsoft Internet Controls

Public Class Form1
  Dim WithEvents TheBrowser As InternetExplorer

  Private Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click
    TheBrowser = New InternetExplorer
    TheBrowser.Visible = True 'В реальном коде .Visible = False
    TheBrowser.Navigate("http://www.myproga.com/newversion.zip")
  End Sub

  Private Sub TheBrowser_FileDownload(ActiveDocument As Boolean, ByRef Cancel As Boolean) Handles TheBrowser.FileDownload
    'ActiveDocument = True -если загружается страница типа http://err.provider.com/vh/404.html, а не окно сохранения файла
    'ActiveDocument = False -если выводится IE-окно сохранения требуемого файла
    If ActiveDocument = True Then TheBrowser.Quit()
    TheBrowser = Nothing
  End Sub

  Private Sub TheBrowser_NavigateError(pDisp As Object, ByRef URL As Object, ByRef Frame As Object, ByRef StatusCode As Object, ByRef Cancel As Boolean) Handles TheBrowser.NavigateError
    'напр. ошибка "Не удается отобразить эту страницу"
    TheBrowser.Quit()
    TheBrowser = Nothing
  End Sub
End Class



Переписываем его через позднее связывание:
Код: vbnet
1.
2.
3.
4.
5.
6.
  Private Sub ButtonDownloadLastBing_Click(sender As Object, e As EventArgs) Handles ButtonDownloadLastBing.Click
    Dim TheBrowserLB As Object
    TheBrowserLB = CreateObject("InternetExplorer.Application")
    TheBrowserLB.Visible = True 'В реальном коде .Visible = False
    TheBrowserLB.Navigate("http://www.myproga.com/newversion.zip")
  End Sub



Но вот как мне в нижнем варианте кода отловить события? Есть какие-то общие решения?

Пара комментов.
1. Для указанного частного случая с COM-объектом InternetExplorer.Application есть типа .Net-замена - WebBrowser - класс . Но я уже его исследовал и пришел к выводу, что он не делает то что мне нужно и так как нужно.
2. Для этого примера с InternetExplorer.Application с обработкой событий можно и забить. Но мне в дальнейшем при миграции моего проекта понадобится к примеру другой системный COM: Microsoft Fax Service Extended COM Type Library (fxscomex.dll). И вот там без событий никак.

Т.е. мне нужно какое-то общее решение для COM + Позднее связывание + События.
...
Рейтинг: 0 / 0
08.02.2015, 15:40
    #38874172
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий77Сразу объясню почему меня не устраивает раннее связывание в .Net.
не нужно объяснять

Дмитрий77Т.е. мне нужно какое-то общее решение для COM + Позднее связывание + События.
оно существует.

влом искать, можно просто посмотреть на говнокод, генеримый студией (любым рефлектором),
там много забавного
...
Рейтинг: 0 / 0
08.02.2015, 16:02
    #38874179
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Изопропилоно существует. влом искать,
Хорошо если существует.
Мне не влом искать. Искал в google по словам типа "late binging withevents vb.net" и им подобным. Толком ничего так и не нашел.
Пытался также решить эту задачу в VB6 (хотя там это не надо - VB6 в этом плане умнее: он при раннем связывании автоматически использует последнюю версию COM имеющуюся на данном компе).
Изопропилможно просто посмотреть на говнокод, генеримый студией (любым рефлектором),
там много забавного
Не очень понимаю что ты имеешь ввиду и что надо делать.
...
Рейтинг: 0 / 0
08.02.2015, 16:16
    #38874184
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий77,

1) ищи примеры на C#
2) добавь к проекту ссылку на COM, рефлектрором изучи сгенерённую сборку
...
Рейтинг: 0 / 0
08.02.2015, 17:09
    #38874194
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Изопропил,

>ищи примеры на 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.
Public Class Form1

  Dim TheBrowser As Object
  Delegate Sub NavigateError(pDisp As Object, ByRef URL As Object, ByRef Frame As Object, ByRef StatusCode As Object, ByRef Cancel As Boolean)

  Private Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click
    TheBrowser = CreateObject("InternetExplorer.Application")
    TheBrowser.GetType.GetEvent("NavigateError").AddEventHandler(TheBrowser, New NavigateError(AddressOf TheBrowser_NavigateError))
    TheBrowser.Visible = True 'В реальном коде .Visible = False
    TheBrowser.Navigate("<ссылка>")
  End Sub

  Private Sub TheBrowser_NavigateError(pDisp As Object, ByRef URL As Object, ByRef Frame As Object, ByRef StatusCode As Object, ByRef Cancel As Boolean)
    'напр. ошибка "Не удается отобразить эту страницу"
    TheBrowser.Quit()
    TheBrowser = Nothing
  End Sub
End Class


(ругается на выделенной строчке, т.е. не может событие таким макаром найти)

>добавь к проекту ссылку на 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)]
Это я и блокнотом где-то видел.
Что именно я должен этим рефлектором смотреть?
...
Рейтинг: 0 / 0
08.02.2015, 18:12
    #38874212
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Я вот еще поискал, состряпал такой код:

Код: vbnet
1.
2.
3.
4.
5.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim TheBrowser As Object = Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"))
    TheBrowser.GetType().InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, Nothing, TheBrowser, New [Object]() {True})
    TheBrowser.GetType().InvokeMember("Navigate", System.Reflection.BindingFlags.InvokeMethod, Nothing, TheBrowser, New [Object]() {"http://www. ..."})
  End Sub


(работает)
Полагаю это универсальный для VB.Net и C# путь имплементации позднего связывания.
И подозреваю что это путь верный (м.б.).
Но пока не врубаюсь как прицепиться к событиям.
...
Рейтинг: 0 / 0
08.02.2015, 18:31
    #38874217
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий77Я вот еще поискал, состряпал такой код:

Код: vbnet
1.
2.
3.
4.
5.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim TheBrowser As Object = Activator.CreateInstance(Type.GetTypeFromProgID("InternetExplorer.Application"))
    TheBrowser.GetType().InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, Nothing, TheBrowser, New [Object]() {True})
    TheBrowser.GetType().InvokeMember("Navigate", System.Reflection.BindingFlags.InvokeMethod, Nothing, TheBrowser, New [Object]() {"http://www. ..."})
  End Sub


(работает)
Полагаю это универсальный для VB.Net и C# путь имплементации позднего связывания.Ничем не отличается от
Код: vbnet
1.
2.
3.
Dim TheBrowser As Object = CreateObject("InternetExplorer.Application")
    TheBrowser.Visible = True
    TheBrowser.Navigate("http://www. ...")

а так же
Код: vbnet
1.
CallByName(TheBrowser, "Visible", True, vbLet)



Те же яйца, только через развесистую объектную модель.
...
Рейтинг: 0 / 0
08.02.2015, 18:52
    #38874225
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Antonariy,

Ну я вот еще нашел.

Receiving Events from late-bound COM servers

Вроде по теме. Но там C# и не совсем понимаю как и чего делать применительно к VB.Net.

Мне весь набор событий не нужен. Как правило нужно всего несколько.
В примере с IE всего 2 из полного набора.
Рефлектрор взял как Изопропил советовал, ну какой-то C# код вижу (похожий на пример), а вот чего делать не понимаю.
...
Рейтинг: 0 / 0
08.02.2015, 18:57
    #38874229
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий77,

древний пример для ворда - http://www.codeproject.com/KB/cs/zetalatebindingcomevents.aspx?display=Print
...
Рейтинг: 0 / 0
08.02.2015, 19:06
    #38874234
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Изопропил,

Ага. Ты не заметил, что ссылка данная тобой совпадает со ссылкой приведенной мной постом выше?
Заумно все очень. Нужен какой-то простой пример именно на 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. Но все равно заумно.
...
Рейтинг: 0 / 0
08.02.2015, 19:31
    #38874240
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий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.
<ComImport(), Guid("000209FE-0000-0000-C000-000000000046"), TypeLibType(CShort(4304))> _
        Private Interface IApplicationEvents2
            <MethodImpl(MethodImplOptions.InternalCall), DispId(2)> _
            Sub Quit()
     
            <MethodImpl(MethodImplOptions.InternalCall), DispId(3)> _
            Sub DocumentChange()
     
            <MethodImpl(MethodImplOptions.InternalCall), DispId(4)> _
            Sub DocumentOpen(<InAttribute(), MarshalAs(UnmanagedType.Interface)> ByVal doc As Object)
     
            <MethodImpl(MethodImplOptions.InternalCall), DispId(6)> _
            Sub DocumentBeforeClose(<InAttribute(), MarshalAs(UnmanagedType.Interface)> ByVal doc As Object,
                                <InAttribute(), Out(), MarshalAs(UnmanagedType.Interface)> ByRef cancel As Boolean)
        End Interface
    End Class

Твой гуид: 0002DF01-0000-0000-C000-000000000046

DispId(2) - число означает порядковый номер члена в таблице экспорта, этот номер можно узнать, ковырнув tlb веббраузера и посчитав порядковые номера FileDownload и NavigateError в их группе.

Если вкратце, то ты тут как бы объявляешь кусок com-интерфейса IE, полностью соответствующий оригиналу, и тем самым фактически имеешь раннее связывание, сделанное своими руками через минимально необходимый интерфейс.
...
Рейтинг: 0 / 0
08.02.2015, 19:39
    #38874241
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий77Но все равно заумно. всё как в старом COM без .net

источник событий реализует IConnectionPointContainer
у него запрашивffют IConnectionPoint ( здесь нужно знать Guid интерфейса событий )
далее - подписаться у полученной СonnectionPoint на события.

Дмитрий77весь набор событий не нужен. Как правило нужно всего несколько
это никого не интересует, придётся реализовать все, что не проблема- интерфейс из рефлектора извлекается - реализация минутное дело. Некий гимор могут параметры- интерфейсы представлять,
их можно заткнуть просто [MarshalAs(UnmanagedType.IUnknown)] object чтоб не тащить описания
...
Рейтинг: 0 / 0
08.02.2015, 19:51
    #38874247
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
меня одного этот Дмитрий 77 раздражает? тут тебе ни кто, ни чем не обязан
...
Рейтинг: 0 / 0
08.02.2015, 19:53
    #38874249
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Roman Mejtesменя одного этот Дмитрий 77 раздражает?Разражает - не читай, проблема-то? Мыши колятся, но продолжают есть кактус?
...
Рейтинг: 0 / 0
08.02.2015, 20:57
    #38874269
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Shocker.ProМыши колятся, но продолжают есть кактус?
это не вопрос, а утверждение.
...
Рейтинг: 0 / 0
08.02.2015, 22:49
    #38874303
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Изопропил,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.
Imports System.Runtime.InteropServices
Imports System.Runtime.CompilerServices

Public Class Form1

  Implements DWebBrowserEvents2
  Dim TheBrowser As Object
  Dim mConnectionPoint As ComTypes.IConnectionPoint
  Dim mSinkCookie As Integer

  Private Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click
    TheBrowser = CreateObject("InternetExplorer.Application")
    DirectCast(TheBrowser, ComTypes.IConnectionPointContainer).FindConnectionPoint( _
                   GetType(DWebBrowserEvents2).GUID, mConnectionPoint)
    mConnectionPoint.Advise(Me, mSinkCookie)
    TheBrowser.Visible = True 'В реальном коде .Visible = False
    TheBrowser.Navigate("http://www. ...")
  End Sub

  Private Sub TheBrowser_FileDownload(ActiveDocument As Boolean, ByRef Cancel As Boolean) Implements DWebBrowserEvents2.FileDownload
    Debug.Print("TheBrowser_FileDownload; ActiveDocument=" & ActiveDocument)
    '  'ActiveDocument = True -если загружается страница типа http://err.provider.com/vh/404.html, а не окно сохранения файла
    '  'ActiveDocument = False -если выводится IE-окно сохранения требуемого файла
    If ActiveDocument = True Then TheBrowser.Quit()
    RemoveConnection()
    TheBrowser = Nothing
  End Sub

  Private Sub TheBrowser_NavigateError(pDisp As Object, ByRef URL As Object, ByRef Frame As Object, ByRef StatusCode As Object, ByRef Cancel As Boolean) Implements DWebBrowserEvents2.NavigateError
    Debug.Print("TheBrowser_NavigateError")
    'напр. ошибка "Не удается отобразить эту страницу"
    TheBrowser.Quit()
    RemoveConnection()
    TheBrowser = Nothing
  End Sub

  Private Sub RemoveConnection()
    If mConnectionPoint IsNot Nothing AndAlso mSinkCookie <> 0 Then
      mConnectionPoint.Unadvise(mSinkCookie)
    End If
    mConnectionPoint = Nothing
    mSinkCookie = 0
  End Sub

  <ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), TypeLibType(CShort(4112))> _
  Private Interface DWebBrowserEvents2

    <MethodImpl(MethodImplOptions.PreserveSig Or MethodImplOptions.InternalCall), DispId(270)> _
    Sub FileDownload(<InAttribute(), MarshalAs(UnmanagedType.Interface)> ByVal ActiveDocument As Boolean,
                                <InAttribute(), Out(), MarshalAs(UnmanagedType.Interface)> ByRef cancel As Boolean)

    <MethodImpl(MethodImplOptions.PreserveSig Or MethodImplOptions.InternalCall), DispId(271)> _
    Sub NavigateError(<InAttribute(), MarshalAs(UnmanagedType.IDispatch)> ByVal pDisp As Object,
                      <InAttribute(), MarshalAs(UnmanagedType.Struct)> ByRef URL As Object,
                      <InAttribute(), MarshalAs(UnmanagedType.Struct)> ByRef Frame As Object,
                      <InAttribute(), MarshalAs(UnmanagedType.Struct)> ByRef StatusCode As Object,
                      <InAttribute(), Out(), MarshalAs(UnmanagedType.Interface)> ByRef Cancel As Boolean)
  End Interface
End Class


Нечего не упустил?

ИзопропилДмитрий77весь набор событий не нужен. Как правило нужно всего несколько
это никого не интересует, придётся реализовать все, что не проблема- интерфейс из рефлектора извлекается - реализация минутное дело. Некий гимор могут параметры- интерфейсы представлять,
их можно заткнуть просто [MarshalAs(UnmanagedType.IUnknown)] object чтоб не тащить описания
Все-таки "все" реализовывать не надо. Достаточно только тех двух-трех что нужны.
=====
Roman Mejtesменя одного этот Дмитрий 77 раздражает? тут тебе ни кто, ни чем не обязан
ТЫ мне ничем не обязан, как и никто другой из присутствующих.
Но меня лично раздражает когда люди начинают извините откровенно срать в чужом топике не по теме, да еще и с переходом на личности, в то время как по теме им сказать (предположительно) нечего.

Я тебя таймером обидел? Извини если так, но там ничего личного не было.
...
Рейтинг: 0 / 0
09.02.2015, 01:02
    #38874334
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Не любитель писать классы, но здесь наверно лучше выносить в отдельный.
Код: 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.
Imports System.Runtime.InteropServices
Imports System.Runtime.CompilerServices

Public Class c_IeFileDownload
  Implements DWebBrowserEvents2
  Private mBrowser As Object
  Private mConnectionPoint As ComTypes.IConnectionPoint
  Private mSinkCookie As Integer

  Public Event DownloadResult(ByVal res As Boolean)

  Public Sub New()
    Try
      mBrowser = CreateObject("InternetExplorer.Application")
      DirectCast(mBrowser, ComTypes.IConnectionPointContainer).FindConnectionPoint( _
                     GetType(DWebBrowserEvents2).GUID, mConnectionPoint)
      mConnectionPoint.Advise(Me, mSinkCookie)
    Catch
    End Try
  End Sub

  Public Sub Navigate(ByVal Url As String, Optional ByVal ShowMainIEWindow As Boolean = False)
    Try
      mBrowser.Visible = ShowMainIEWindow
      mBrowser.Navigate(Url)
    Catch
      RaiseEvent DownloadResult(False)
    End Try
  End Sub

  Private Sub FileDownload(ActiveDocument As Boolean, ByRef Cancel As Boolean) _
   Implements DWebBrowserEvents2.FileDownload
    'Debug.Print("TheBrowser_FileDownload; ActiveDocument=" & ActiveDocument)
    '  'ActiveDocument = True -если загружается страница типа http://err.provider.com/vh/404.html, а не окно сохранения файла
    '  'ActiveDocument = False -если выводится IE-окно сохранения требуемого файла
    If ActiveDocument = True Then mBrowser.Quit()
    RemoveConnection()
    mBrowser = Nothing
    RaiseEvent DownloadResult(Not ActiveDocument)
  End Sub

  Private Sub NavigateError(pDisp As Object, ByRef URL As Object, ByRef Frame As Object, ByRef StatusCode As Object, ByRef Cancel As Boolean) Implements DWebBrowserEvents2.NavigateError
    'Debug.Print("TheBrowser_NavigateError")
    'напр. ошибка "Не удается отобразить эту страницу"
    mBrowser.Quit()
    RemoveConnection()
    mBrowser = Nothing
    RaiseEvent DownloadResult(False)
  End Sub

  Private Sub RemoveConnection()
    If mConnectionPoint IsNot Nothing AndAlso mSinkCookie <> 0 Then
      mConnectionPoint.Unadvise(mSinkCookie)
    End If
    mConnectionPoint = Nothing
    mSinkCookie = 0
  End Sub

  <ComImport(), Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), TypeLibType(CShort(4112))> _
  Private Interface DWebBrowserEvents2

    <MethodImpl(MethodImplOptions.PreserveSig Or MethodImplOptions.InternalCall), DispId(270)> _
    Sub FileDownload(<InAttribute(), MarshalAs(UnmanagedType.Interface)> ByVal ActiveDocument As Boolean,
                                <InAttribute(), Out(), MarshalAs(UnmanagedType.Interface)> ByRef cancel As Boolean)

    <MethodImpl(MethodImplOptions.PreserveSig Or MethodImplOptions.InternalCall), DispId(271)> _
    Sub NavigateError(<InAttribute(), MarshalAs(UnmanagedType.IDispatch)> ByVal pDisp As Object,
                      <InAttribute(), MarshalAs(UnmanagedType.Struct)> ByRef URL As Object,
                      <InAttribute(), MarshalAs(UnmanagedType.Struct)> ByRef Frame As Object,
                      <InAttribute(), MarshalAs(UnmanagedType.Struct)> ByRef StatusCode As Object,
                      <InAttribute(), Out(), MarshalAs(UnmanagedType.Interface)> ByRef Cancel As Boolean)
  End Interface

End Class

=====

Public Class Form1

  Private Sub ButtonDownload_Click(sender As Object, e As EventArgs) Handles ButtonDownload.Click
    Dim IEdown As New c_IeFileDownload
    AddHandler IEdown.DownloadResult, AddressOf DownloadResult
    IEdown.Navigate("http://www. ...", False)
  End Sub

  Private Sub DownloadResult(ByVal res As Boolean)
    Debug.Print("DownloadResult=" & res)
  End Sub

End Class

...
Рейтинг: 0 / 0
09.02.2015, 11:00
    #38874547
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий77Все-таки "все" реализовывать не надо. Достаточно только тех двух-трех что нужны.
от COM- сервера зависит.

некоторым не очень нравится несоблюдение контракта(в общем случае)
...
Рейтинг: 0 / 0
09.02.2015, 15:08
    #38874865
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
ИзопропилДмитрий77Все-таки "все" реализовывать не надо. Достаточно только тех двух-трех что нужны.
от COM- сервера зависит.

некоторым не очень нравится несоблюдение контракта(в общем случае)

Что значит "несоблюдение контракта"?

Все-таки переписывать всю модель COM-компонента для простой задачки это круто. И потом (в приведенном примере например) там кроме InternetExplorer еще куча объектов.
Или речь идет об отдельно взятом интерфейсе (DWebBrowserEvents2 для этого примера)?
Потом если ты декларируешь функцию события в интерфейсе, то ее обязательно надо прописывать в классе, который этот интерфейс использует -куча пустышек или куча невостребованных RaiseEvent.

В примере с Word тоже не все ф-ции переписаны вроде (не в C#-ном а в VB.Net примере -я приводил ссылку).

К счастью я эти COM редко использую, и еще реже с событиями.
В VB6 я откровенно недолюбливал OCX-ы.

Дойду вот до этого
Fax Service Extended COM Reference
-уже тогда буду смотреть.
В VB6 у меня раннее связывание, которое никогда не подводило, начиная с XP и кончая 8.1.

ADODB еще понадобится (там правда достаточно максимальную версию указать при раннем связывании). Но там без событий. Кстати для x64 кода эта кухня предполагаю не заведется.

Счас главное было понять принцип.
...
Рейтинг: 0 / 0
09.02.2015, 15:49
    #38874924
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно?
Дмитрий77ADODB еще понадобится

контракт - заявил подписчик, что реализует ConnectionEvents (00001400-0000-0010-8000-00AA006D2EA4) -
значит реализует полностью

если подписаться на события Connection и не реализовать WillConnect - Open завершится неудачей

Почему работает неполная реализация - события вызываются одиннхер через IDispatch, а офис и эксплорер спокойно относятся к тому, что клиент не обеспечил обработку всех событий

Дмитрий77Потом если ты декларируешь функцию события в интерфейсе, то ее обязательно надо прописывать в классе, который этот интерфейс использует -куча пустышек
при раннем связывании именно такие пустышки и генерятся - вот оттуда и можно их стащить.
заодно поправить типы параметров, бывает что кривенько работает импорт (одиночный указатель вместо массива, строка не того типа и т д) или просто достаточно IntPtr получить , а не структуру или интерфейс
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VB.Net + CreateObject(COM,позднее связывание) + WithEvents? Возможно? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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