powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как реализовать CreateObject(позднее связывание) + WithEvents?
16 сообщений из 16, страница 1 из 1
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38873832
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрим на этот старый топик:
Загрузить файл через IE, дождаться завершения и отловить если что ошибки

Я немного поигрался. Вопрос в принципе решается.
Нужно реализовать такой код (смысл, чтоб окно IE было закрыто в любом случае, на экран выводится только диалог сохранения, при ошибке невидимое окно IE надо закрыть):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Option Explicit

Dim WithEvents TheBrowser As InternetExplorer

Private Sub Command1_Click()
  Set TheBrowser = New InternetExplorer
  TheBrowser.Visible = True 'В реальном коде .Visible =False
  TheBrowser.Navigate ("http://www.myproga.com/newversion.zip")
End Sub

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

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



Мне надо переписать этот код (события!!!) для позднего связывания :
Код: vbnet
1.
2.
Dim TheBrowser as Object
Set TheBrowser = CreateObject("InternetExplorer.Application")



Вообще говоря мне это нужно сейчас сделать в VB.Net а не в VB6. Но решил поиграться сначала в VB6.
Использовать раннее связывание в .Net я не рискну - там для COM версии автоматически не подставляются если делать ранние ссылки.
Смотрел еще на тамошний объект WebBrowser, но что-то он мне для этой задачи не нравится.

Создал тему в .Net:
Вызов стандартного окна загрузки IE
но никто ничего не отвечает.
Решил здесь спросить.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38873835
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМне надо переписать этот код (события!!!) для позднего связывания:зачем?
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38873845
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Я ж написал.
>Использовать раннее связывание в .Net я не рискну - там для COM версии автоматически не подставляются если делать ранние ссылки.

На примере ADODB уже проверял. В проекте ссылаешься на одну версию, он ровно ее и хочет.
Т.е. добавлю ссылку, а на другом компе сглючит. (В VB6 в этом плане автоматика, а в .Net ее нет).
А CreateObject с гарантией прокатывает и там и тут.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38873903
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, не знаю, на днях буду пробовать, там какой-то хакер создал браузер на вба, там главное нет этого ... Loop при открытии страниц, ну и без ишачка может обойдёмся, главное чем зацепило, автор пишет, можно делать практически всё...может опробуете, или свой напишите ишачок
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38873904
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофаДмитрий77, не знаю, на днях буду пробовать, там какой-то хакер создал браузер на вба, там главное нет этого ... Loop при открытии страниц, ну и без ишачка может обойдёмся, главное чем зацепило, автор пишет, можно делать практически всё...может опробуете, или свой напишите ишачокЧто-то весна у Эндрю в этом сезоне рано наступила )
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38873992
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Дмитрий77,
> Мне надо переписать этот код (события!!!) для позднего связывания:
>
> Dim TheBrowser as Object
> Set TheBrowser = CreateObject("InternetExplorer.Application")

Стандартный решение:
Код: vbnet
1.
2.
3.
4.
5.
Dim TheBrowser as Object
Set TheBrowser = CreateObject("InternetExplorer.Application")
ConnectObject TheBrowser, "TheBrowser_"

' Обработчики, как у тебя написано

Не работатет. Причина.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874039
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

вот ссылка, находил для другого форума, сам не пробовал

COM: Handle Late-bound Events within Visual Basic Using an ATL Bridge
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874047
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища
Код: vbnet
1.
ConnectObject TheBrowser, "TheBrowser_" 



скукотища, Казанский

ConnectObject откуда берете?
WScript? Кстати как добыть?
Ссылка на еще один COM? Фигово.

>Использовать раннее связывание в .Net я не рискну - там для COM версии автоматически не подставляются если делать ранние ссылки.
Поясню еще раз.
Если раннее связывание забабахать в .Net, то оно конечно на developer компе заработает.
А потом когда конвертануть код x86-> x64, поменять версию .Net (?), перенести на другой комп (я пробовал с 8.1 на XP),
то имеем:
Невозможно загрузить файл или сборку "Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null" или один из зависимых от них компонентов. Сборка создана в более поздней версии среды выполнения чем текущая, и не может быть загружена.
Нельзя в .Net так вольно ссылки на COM-ы делать. В VB6 еще как правило прокатывает (не уверен что всегда).
А вот
CreateObject("InternetExplorer.Application")
волшебно сработает на любой OS и под 64-битным кодом тоже (ну если конечно есть 64-битная реализация для COM так понимаю).
Но нужны события.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874053
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,
ConnectObject из WScript. Но, с объектом InternetExplorer.Application эта радость не работает. Посмотри ссылку в 17233336 .
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874062
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища,

А зачем тогда смотреть, если не работает? Зачем себя этим грузить?
Тем более слово WScript радости не особо внушает само по себе. Тем более что мне это надо воткнуть в .Net.

Попробую еще с .Net -WebBrowser поиграться. Но он похоже вообще события не генерирует, если делать .Navigate во внешнем окне (вызывает именно новое окно IE). А аналога именно InternetExplorer (а не WebBrowser) в .Net-классах походу нет.

Т.е. свой COM-полуфабрикат я конечно могу использовать и в .Net, но без событий, т.е. без TheBrowser.Quit в случае ошибки - окно IE останется висеть.
Подозреваю что этим все опять и закончится.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874087
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Дмитрий77,
> А зачем тогда смотреть, если не работает? Зачем себя этим грузить?

Чтобы не искать несуществующую кошку в темной комнате.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874102
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Обрати внимание на ссылку, данную Казанским. Я когда-то её копал, и вроде не увидел принципиальной невозможности реализовать то же на VB или VBA. Но забросил, за отсутствием острой необходимости.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874163
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктОбрати внимание на ссылку, данную Казанским.
Обратил. А на что конкретно смотреть? Статья старая, заумная и подссылки в ней не работают.
Бенедиктне увидел принципиальной невозможности реализовать то же на VB или VBA.
Мне нужно это реализовать в .Net. (в VB.Net)
В VB6 острой необходимости в позднем связывании в общем-то нет.
Потому что VB6 автоматически подставляет последнюю имеющуюся на данном компе версию COM-компонента.
А в .Net с этим похоже задница, какую версию COM при разработке указал, на ту версию он и создаст обертку и ее же требует.
Для системных COM (которые есть на любом компе/OS, но при этом версии прыгают) это неприемлимо.

Ну я рискнул создать в .Net-разделе похожую тему , но от тамошних товарищей дождаться путных ответов вероятность мала, в основном только язвят.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874245
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Возможно, если конечно использование IE не является обязательным условием, а цель - скачивание файла с web ресурса в "тихом режиме", Вам подойдет такой вариант: для собственно скачивания файла воспользоваться методом DownloadFile класса WebClient . Проект скомпилировать с опцией Any CPU , что должно решить проблему битности. А также выбрать целевую версию .NET 2.0 , которая должна будет работать на всех (почти) устройствах где есть хоть какая-то .NET Framework. А если воспользоваться try/catch, то в случае ошибки будет возвращаться exception типа WebException или в редких случаях NotSupportedException.

Например, класс, реализующий такую идею, мог бы выглдяеть так на C# (полагаю, переписать на VB.NET не должно составить большого труда):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
using System;
using System.Net;

namespace WebDownload
{
    public class WebDownload
    {
        public string Download(string Link, string Destination)
        {
            var status = @"Not Available";
            try
            {
                var wc = new WebClient();
                wc.DownloadFile(Link, Destination);
                status = @"OK";
            }
            catch (Exception ex)
            {
                status = ex.ToString();
            }
            return status;
        }
    }
}




А использование класса так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
using System;

namespace MyConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var wd = new WebDownload.WebDownload();
            var status = wd.Download(@"http://download.thinkbroadband.com/5MB.zip", @"D:\test\test.zip");
            Console.WriteLine(status);

            Console.Read();
        }
    }
}

...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874314
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyесли конечно использование IE не является обязательным условием, а цель - скачивание файла
В данном примере с IE обязательным условием таки является использование IE для скачивания файла (в "громком" режиме, но без вывода фонового окна самого IE).

Но в этом примере на события IE можно было бы и забить (3 года назад так и сделал).
Дело в том, что у меня есть другие системные COM с которыми я работаю,
которые не заменишь на .Net-классы и для которых забить на события не получится.
Поэтому я и вцепился в тему "Позднее связывание + события".

Но похоже вопрос решить удалось (именно на примере IE), спасибо Antonariy и Изопропилу за поддержку.
17235746
Код: 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


В VB6 как сделать не знаю, но такой цели и не было.
...
Рейтинг: 0 / 0
А как реализовать CreateObject(позднее связывание) + WithEvents?
    #38874343
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Могу предложить такой вариант на скорую руку:

Код: c#
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.
using System;
using System.Net;

namespace WebDownload
{
    public class WebDownload
    {
        public event EventHandler<WebDownloadEventArgs> Error;
        public event EventHandler<WebDownloadEventArgs> FileDownload;

        public void Download(string Link, string Destination)
        {
            try
            {
                var request = (HttpWebRequest)System.Net.HttpWebRequest.Create(Link);
                request.Method = "HEAD";
                var response = (HttpWebResponse)request.GetResponse();

                if (response.ContentLength != -1)
                {
                    OnFileDownLoad(new WebDownloadEventArgs() { Status = @"FileDownload" });
                    var wc = new WebClient();
                    wc.DownloadFile(Link, Destination);
                    OnFileDownLoad(new WebDownloadEventArgs() { Status = @"Download completed" });
                }
                else
                {
                    OnFileDownLoad(new WebDownloadEventArgs() { Status = @"Not download content" });
                }
            }
            catch (Exception ex)
            {
                OnError(new WebDownloadEventArgs() { Status = ex.ToString() });
            }
        }

        private void OnFileDownLoad(WebDownloadEventArgs e)
        {
            if (FileDownload != null)
            {
                FileDownload(this, e);
            }
        }

        private void OnError(WebDownloadEventArgs e)
        {
            if (Error != null)
            {
                Error(this, e);
            }
        }
    }

    public class WebDownloadEventArgs : EventArgs
    {
        public string Status { get; set; }
    }
}



using System;

Код: c#
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.
namespace MyConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var link = @"http://www.google.com";
            var dest = @"D:\test\test.zip";

            var link2 = @"http://download.thinkbroadband.com/5MB.zip";
            var dest2 = @"D:\test\test2.zip";

            var link3 = @"http://test.test";
            var dest3 = @"D:\test\test3.zip";

            var wd = new WebDownload.WebDownload();
            wd.Error += wd_Error;
            wd.FileDownload += wd_FileDownload;

            wd.Download(link, dest);
            wd.Download(link2, dest2);
            wd.Download(link3, dest3);

            Console.Read();
        }

        static void wd_FileDownload(object sender, WebDownload.WebDownloadEventArgs e)
        {
            Console.WriteLine(e.Status);
        }

        static void wd_Error(object sender, WebDownload.WebDownloadEventArgs e)
        {
            Console.WriteLine(e.Status);
        }
    }
}

...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как реализовать CreateObject(позднее связывание) + WithEvents?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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