Следую совету, заодно узнаю на сколько это полезно

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 07.01.2016 (Чт) 21:49

Прошу простых советов, тут ведь есть мастера многопоточных параллельных вычислений и более страшных слов :eye:
В общем, я думаю перенести код из класса в форму, грузить штук по 20 копий этой формы, каждой давать URI для запроса и байт-массив из массива для ответа.
Сделаю, чтоб отработавшая форма выгружалась. В цикле контроля пробегаю по массиву ответов, сколько ответов получено, столько гружу новых инстансов форм.
И так до конца моего отфильтрованного списка ссылок, чтоб каждую проверить на Content-Type: text/html, получить время Last-Modified: и размер Content-Length:

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Proxy » 07.01.2016 (Чт) 22:18

Вырвано из контекста, ничего не понятно.
В чем вообще задача?
Речь о VB6?
Follow the white rabbit.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 07.01.2016 (Чт) 22:39

Это параллельное обсуждение того, что я тут делаю http://bbs.vbstreets.ru/viewtopic.php?f=1&t=51705&start=90 Да, на vb6. Описываю всё по шагам.
Есть список ссылок, чтобы проверить заголовки Content-Type: text/html, Last-Modified: и Content-Length: каждого URI нужно выполнить сотни HEAD запросов.
Код использующий WinSocket апи у меня реализован в виде класса, которому я передаю инстанс формы для фидбэка, хочу переписать код в форму и т.д.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.01.2016 (Пт) 4:01

Много форм не означает много потоков - поток по-прежнему один.
А всё остальное - да.

Почему бы тебе не взять язык, в котором всё куда проще и с многопоточностью, и с http-запросами?

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 08.01.2016 (Пт) 4:33

Java ?

В 1м потоке таймеры выполняются последовательно, но быстро, на выполнение своей работы мой код тратит мизер времени, тормоза в сети.
Я знаю, что поток один и тот же, но апи типа асинхронные и интернет всё равно медленнее, так что это неплохое решение, как мне кажется.

Перед обращением к публичной процедуре очередной новой формы готовлю HEAD запрос в соответствующем байт-массиве,
когда происходит успешный коннект, то запускается таймер, по которому серверу передаётся мой запрос из байт-массива.
Если передача не удалась, то в fLen получаю -1, флаг ошибки, иначе через пару секунд там будет размер ответа, а ответ в fArr.
Недостаток пока вижу только один, код рассчитан на то, что ответ будет сразу полным в 1м куске, но так оно и должно быть.

В модуле:
Код: Выделить всё
Private Type ArrArr
  fLen   As Long
  fType  As Long
  fTime  As Date
  fArr() As Byte
End Type

Public RecBytes()          As ArrArr     'полученные байт-массивы HEAD запросов

и форма:
Код: Выделить всё
VERSION 5.00
Begin VB.Form Form2
   BorderStyle     =   1  'Fixed Single
   ClientHeight    =   585
   ClientLeft      =   45
   ClientTop       =   375
   ClientWidth     =   1410
   BeginProperty Font
      Name            =   "Tahoma"
      Size            =   8.25
      Charset         =   204
      Weight          =   400
      Underline       =   0   'False
      Italic          =   0   'False
      Strikethrough   =   0   'False
   EndProperty
   Icon            =   "Form2.frx":0000
   MaxButton       =   0   'False
   MinButton       =   0   'False
   Moveable        =   0   'False
   ScaleHeight     =   585
   ScaleWidth      =   1410
   ShowInTaskbar   =   0   'False
   StartUpPosition =   3  'Windows Default
   Begin VB.Timer Timer1
      Enabled         =   0   'False
      Interval        =   100
      Left            =   0
      Top             =   0
   End
End
Attribute VB_Name = "Form2"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Const WSADESCRIPTION_LEN  As Long = 257
Private Const WSASYS_STATUS_LEN   As Long = 129

Private Type WSAData
  wVersion       As Integer
  wHighVersion   As Integer
  szDescription  As String * WSADESCRIPTION_LEN '257
  szSystemStatus As String * WSASYS_STATUS_LEN '129
  iMaxSockets    As Integer
  iMaxUdpDg      As Integer
  lpVendorInfo   As Long
End Type

Private Type sockaddr_in
  sin_family       As Integer
  sin_port         As Integer
  sin_addr         As Long
  sin_zero(1 To 8) As Byte
End Type

Private Declare Function WSAStartup _
                Lib "ws2_32.dll" (ByVal wVR As Long, _
                                  lpWSAD As WSAData) As Long

Private Declare Function gethostbyname Lib "wsock32" (ByVal hostname As String) As Long

Private Declare Sub CopyMemory _
                Lib "kernel32" _
                Alias "RtlMoveMemory" (xDest As Any, _
                                       xSource As Any, _
                                       ByVal nbytes As Long)

Private Declare Function inet_addr Lib "ws2_32.dll" (ByVal cp As String) As Long

Private Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer

Private Declare Function Socket _
                Lib "ws2_32.dll" _
                Alias "socket" (ByVal afi As Long, _
                                ByVal s_type As Long, _
                                ByVal protocol As Long) As Long

Private Declare Function Con _
                Lib "ws2_32.dll" _
                Alias "connect" (ByVal S As Long, _
                                 ByRef name As sockaddr_in, _
                                 ByVal namelen As Long) As Long

Private Declare Function WSAAsyncSelect _
                Lib "ws2_32.dll" (ByVal S As Long, _
                                  ByVal hWnd As Long, _
                                  ByVal wMsg As Long, _
                                  ByVal lEvent As Long) As Long

Private Declare Function send _
                Lib "ws2_32.dll" (ByVal S As Long, _
                                  ByRef buf As Any, _
                                  ByVal BufLen As Long, _
                                  ByVal flags As Long) As Long

Private Declare Function recv _
                Lib "ws2_32.dll" (ByVal S As Long, _
                                  ByRef buf As Any, _
                                  ByVal BufLen As Long, _
                                  ByVal flags As Long) As Long

Private Declare Function closesocket Lib "ws2_32.dll" (ByVal S As Long) As Long

Private Declare Function WSACleanup Lib "ws2_32.dll" () As Long

Private APISoket            As Long       'хэндл сокета

Private lIndex               As Long       'индекс в массиве байт-массивов

Private Sub Form_Load()

  Const WINSOCK_VERSION As Long = 1

  Dim WSAD As WSAData

  WSAStartup WINSOCK_VERSION, WSAD
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

  Const MAX_BUFFER_LENGTH               As Long = 8192

  Static Answer                         As String 'текущий индекс байт-массива
  Dim reBytes                           As Long 'кол-во принятых байт
  Dim arrBuffer(1 To MAX_BUFFER_LENGTH) As Byte 'буферный байт-массив

  reBytes = recv(APISoket, arrBuffer(1), MAX_BUFFER_LENGTH, 0&)

  If reBytes > 0& Then
'байт-массив начинается с нулевого байта, а кол-во принятых байт посчитано с первого, поэтому -1
    ReDim RecBytes(lIndex).fArr(reBytes - 1&)
    RecBytes(lIndex).fLen = reBytes
    CopyMemory RecBytes(lIndex).fArr(0), arrBuffer(1), reBytes
  End If
  Unload Me
End Sub

Private Sub Form_Unload(Cancel As Integer)
  closesocket (APISoket)
  WSACleanup
End Sub


Private Function GetIPFromHostName(ByRef sHostName As String) As String

  Const cDot       As String = "."

  Dim nbytes       As Long
  Dim ptrHosent    As Long
  Dim ptrName      As Long
  Dim ptrAddress   As Long
  Dim ptrIPAddress As Long
  Dim sAddress     As String

  sAddress = Space$(4&)
  ptrHosent = gethostbyname(sHostName & vbNullChar)

  If ptrHosent <> 0 Then
    ptrAddress = ptrHosent + 12&
    CopyMemory ptrAddress, ByVal ptrAddress, 4&
    CopyMemory ptrIPAddress, ByVal ptrAddress, 4&
    CopyMemory ByVal sAddress, ByVal ptrIPAddress, 4&
    GetIPFromHostName = CStr(Asc(sAddress)) & cDot & CStr(Asc(Mid$(sAddress, 2&, 1&))) & cDot & CStr(Asc(Mid$(sAddress, 3&, 1&))) & cDot & CStr(Asc(Mid$(sAddress, 4&, 1&)))
  End If
End Function

Public Sub Connect(ByRef Index As Long, ByVal Host As String, Optional ByVal Port As Long = 80&)

  Const SOCK_STREAM     As Long = 1
  Const AF_INET         As Long = 2
  Const FD_READ         As Long = &H1
  Const FD_CLOSE        As Long = &H20
  Const WM_LBUTTONUP    As Long = &H202

  Dim constr      As sockaddr_in  'адрес хоста в спец. типе данных

  If Not Host Like "?##.?##.?##.?##" Then Host = GetIPFromHostName(Host)

  lIndex = Index
  constr.sin_addr = inet_addr(Host)
  constr.sin_family = 2
  constr.sin_port = htons(Port)
  APISoket = Socket(AF_INET, SOCK_STREAM, 6&)
  RecBytes(lIndex).fLen = Con(APISoket, constr, Len(constr))

  If RecBytes(lIndex).fLen = -1& Then
    Unload Me
  Else
    WSAAsyncSelect APISoket, Me.hWnd, WM_LBUTTONUP, FD_READ Or FD_CLOSE
    Timer1.Enabled = True
  End If
End Sub

Private Sub Timer1_Timer()
  Timer1.Enabled = False
  RecBytes(lIndex).fLen = send(APISoket, RecBytes(lIndex).fArr(0), UBound(RecBytes(lIndex).fArr), 0&)
  If RecBytes(lIndex).fLen = -1& Then Unload Me
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение alibek » 08.01.2016 (Пт) 12:28

Adam Smith, хватит уже ерундой заниматься.
В другом топике тебе дали более чем достаточно информации для решения задачи.
Если для тебя это слишком сложно, то не трогай сокеты и низкоуровневые инструменты.
Подключи библиотеку Microsoft WinHTTP (которая входит в состав ОС начиная не то с W2k, не то с WXP) и используй ее.
Lasciate ogni speranza, voi ch'entrate.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.01.2016 (Пт) 14:13

Adam Smith писал(а):Java ?

VB.NET / C# и ещё.
Про джаву не знаю.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Хакер » 08.01.2016 (Пт) 15:45

Qwertiy только и агитирует за дотнет. :)

Если у человека в голове кокаинум хаос, то дотнет особо не спасёт особо.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 08.01.2016 (Пт) 15:52

Нашел, Хакер упоминал WinHTTP, там есть готовые функции. Заниматься ерундой это про код формы? Ну использую другие апи, но форма всё равно нужна.
И всё равно нужно грузить кучу инстансов формы, чтобы за одно и тоже время параллельно получать данные по десяткам ссылок.

Хакер писал(а):Если у человека в голове кокаинум хаос, то дотнет особо не спасёт особо.
фееричная чушь)

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 08.01.2016 (Пт) 16:51

Хакер писал(а):Qwertiy только и агитирует за дотнет. :)

В этом разделе можно :)

Хакер писал(а):Если у человека в голове кокаинум хаос, то дотнет особо не спасёт особо.

Согласен. Но там встроенная библиотека гораздо больше, чем в VB6. И реализовывать самому получение chunked не придётся. И с многопоточностью проблем нет. А теперь ещё и async/await - для скачивания файлов идеально подходит.

Adam Smith писал(а):Нашел, Хакер упоминал WinHTTP, там есть готовые функции.

Ну так используй их?

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 08.01.2016 (Пт) 17:11

Блин, нормального примера не найду никак.

UPD: Нашел, переписал. Возвращаю всё в класс, не нужна форма если контрольный опрос извне всё равно по таймеру происходит.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 10.01.2016 (Вс) 2:29

Зависают классы, как-то рандомно. Более менее выполняет когда даю сервер с содержимым типа этого:
Код: Выделить всё
Index of /update/v5/windows/img/rtelecom/icon/service/

../
pi_bank_alpha.png                                  18-Nov-2014 11:50                7007
pi_bank_alpha_ls.png                               18-Nov-2014 11:35                9874
pi_bank_anelik.png                                 09-Jun-2015 14:13                4761
........................................................................................
На обычных сайтах всё гораздо хуже. Если бы всегда одна и та же ссылка вешала было бы понятно.
Всё таки нужны потоки и нужно как-то возвращаться к байт-массивам, строки память едят нещадно.
Последний раз редактировалось Adam Smith 10.01.2016 (Вс) 20:15, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение alibek » 10.01.2016 (Вс) 11:24

Adam Smith писал(а):Зависают классы, как-то рандомно.

Делай правильно, зависать не будет.
Знакомый несколько лет назад делал парсер yell.com и обрабатывал десятки и сотни тысяч ссылок.

Adam Smith писал(а):Всё таки нужны потоки и нужно как-то возвращаться к байт-массивам, строки память едят нещадно.

То есть все работает хорошо и проблема только в потреблении памяти?
Сюрприз, WinHTTP также умеет работать с байтовыми массивами.
Lasciate ogni speranza, voi ch'entrate.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 10.01.2016 (Вс) 21:24

Увидеть бы как правильно, ато истина никак мне не приснится, яблоко не падает, озарения нет, муза в отпуске, стимуляторы не использую и архитектор плохой.
Ну ты крутой, раз у тебя ТАКИЕ знакомые. Правильно я понял?) Или имелось ввиду, что он тоже под Windows это делал и WinHTTP как-то грамотно использовал?
Зависает, и так не задумано, значит не хорошо. На счет памяти это наверное я зря. После скрытого IE ~30Mb можно также около 30 кушать и не краснеть.
Я снова попробую без IE, как прежде получать страничку в виде мегамассива и передавать её в MSHTML, только не на апи, а как сейчас, через позднее связывание:
Код: Выделить всё
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) = True
и т.д.
WinHttp самостоятельно и с SSL, и с transfer-encoding разберется лучше чем я мог бы придумать, и страницу в виде мегабайт-массива вернет, судя по MSDN.
Правда с зависаниями всё равно нужно разобраться. Кстати если не партиями, а все сразу запустить, то получается на ~1500 ссылок около 40Mb, не так много.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Хакер » 10.01.2016 (Вс) 21:27

Adam Smith писал(а):
Код: Выделить всё
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    objHTTP.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) = True

Где тут признаки позднего связывания?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 11.01.2016 (Пн) 10:11

Там же где и тут https://msdn.microsoft.com/ru-ru/library/7t9k08y5(v=vs.90).aspx
Код: Выделить всё
Sub CreateADODB()
   Dim adoApp As Object
   adoApp = CreateObject("ADODB.Connection")
End Sub
Тип объектной переменной, используемой для сохранения возвращаемого объекта, может влиять на производительность приложения. Объявление объектной переменной при помощи предложения As Object приводит к созданию переменной, которая может содержать ссылку на любой тип объекта. Тем не менее, обращение к объекту через эту переменную организуется с поздним связыванием — это значит, что связывание производится в ходе выполнения программы. Существует множество причин для того, чтобы избегать позднего связывания; в их число входит и снижение производительности приложения.
Можно создать объектную переменную, которая приводит к раннему связыванию — т.е. связыванию при компиляции программы. Чтобы сделать это, добавьте ссылку на библиотеку типов для объекта при помощи вкладки COM диалогового окна Добавить ссылку в меню Проект. Затем объявите объектную переменную типа, соответствующую объекту. В большинстве случаев для создания объекта вместо функции CreateObject более эффективно будет использовать инструкцию Dim и основную сборку взаимодействия.

Я конечно понимаю, что микрософт для тебя вообще не авторитет ни разу. Но может это меня хоть немного оправдывает?
Млин уже не знаю, что можно написать, а что нет, чтобы не подрываться на твоих минах, сапёр чёртов, КПИ маловат, наверное начну игнорить.
Последний раз редактировалось Adam Smith 11.01.2016 (Пн) 10:19, всего редактировалось 2 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Хакер » 11.01.2016 (Пн) 10:13

Что ты этим хотел сказать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 11.01.2016 (Пн) 10:16

А ты что хотел спросить?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Хакер » 11.01.2016 (Пн) 10:23

Чтобы ты показал, где в выложенном тобою коде признаки позднего связывания. А не процитировал мне наспех найденный переведённый фрагмент доки с MSDN.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.01.2016 (Пн) 18:30

Adam Smith писал(а):Там же где и тут https://msdn.microsoft.com/ru-ru/library/7t9k08y5(v=vs.90).aspx

А вот и не было у тебя аналогичной строки в сообщении (хотя можно было по этому поводу и промолчать):
Код: Выделить всё
Dim adoApp As Object

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 12.01.2016 (Вт) 12:51

CreateObject я очевидно использую потому, что не подключил WinHTTP в референсах. Ну даже если бы я объявил переменную как вариант это ни разу не делает позднее связывание ранним.
Вообще это всё очевидно, ничего необычного, широко распространенные практика, но не для вас конечно. Вы будете утверждать обратное потому, что цель у вас другая, и она тоже понятна.
Я специально не спешил с ответом, раз уж мои ответы "наспех" очень не нравятся. Хотя опять же, понятно, что дело не в оперативности и не в источниках ответов. Вопрос то у меня другой.
Скопипастил код без деклараций и поэтому написал про позднее связывание, СПЕЦИАЛИСТАМ должно стать понятно, что переменная объявлена так:
Код: Выделить всё
Private objHTTP As Object

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Хакер » 12.01.2016 (Вт) 12:56

Adam Smith писал(а):Ну даже если бы я объявил переменную как вариант это ни разу не делает позднее связывание ранним.

Не делает ранним. Зато ты мог её объявить не как Object и не как Variant, и это бы, наверняка, делало связывание ранним.

Adam Smith писал(а):CreateObject я очевидно использую потому, что не подключил WinHTTP в референсах.

А вот сам CreateObject абсолютно никакого отношения к типу связывания не имеет.

В твоём посте ты написал «использую позднее связывание», затем двоеточие, затем пример кода, поясняющий слова про позднее связывание. В примере кода не было ни малейшего намёка на позднее связывание, зато был вызов CreateObject, один только вид которой заставляет толпы заблуждающийся думать, что раз используется CreateObject, то есть повод говорить о позднем связывании.

что не подключил WinHTTP в референсах.

Откуда тогда взялась константа WinHttpRequestOption_EnableHttpsToHttpRedirects? Не уж-то вручную объявил?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 12.01.2016 (Вт) 12:59

Андерстэнд? Толпы заблуждающихся, я у вас спрашиваю)), надеюсь сервер то выдержит ответ этой толпы.
Код: Выделить всё
Private lIndex  As Long   'индекс текущей в массиве ссылок
Private objHTTP As Object

Private Sub Class_Initialize()

  Const WinHttpRequestOption_EnableHttpsToHttpRedirects = 12

  Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
  'Enable redirection from HTTPS to HTTP (is Off by default)
  objHTTP.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) = True
End Sub

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Хакер » 12.01.2016 (Вт) 13:07

Я не понимаю, почему ты ехидничаешь?

Всем очевидно, что твои знания предмета мозаичные и обрывочные. Этим разит из почти каждого твоего поста.

Когда тебе намекают на то, что у тебя о каких-то вещах существует ошибочное представление, ты начинаешь отказываться от своих слов, параллельно идёшь гуглить информацию, находишь правильное знание, а потом начинаешь всеми правдами и неправдами пытаться произвести впечатление, что никакого незнания или заблуждения касательно отдельного взятого аспекта у тебя не было, а тебя просто неправильно поняли и вообще ты имел в виду совсем другое.

Помимо того, что это выглядит глупо, это ещё и совершенно непродуктивно. Твоё дело меньше возражать, больше слушать и впитывать информацию, а не после каждого исправления возражать «да вообще-то я так и думал, я это и имел в виду, вы не подумайте!».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 12.01.2016 (Вт) 13:51

Почему ты отвечаешь вопросом на вопрос? Мне кажется ты ехидничаешь. Ну и я в ответ, почему бы и нет. Отдельно взятое ранее или позднее связывание? Самому не смешно? Наверное 50% всех примеров для VB6 в интернетах об этом.
Я уже и не помню когда этим вопросом интересовался и в надежде, что страница всё ещё существует пошел гуглить потому, что точно помню, что читал об этом на MSDN. Гуглю я не только на твои вопросы, но и на свои нередко.
Намекаете вы на правильные направления, а о моих обрывочных знаниях вы говорите прямо и в каждом посте. Это вообще единственная ваша цель, и какбэ не замечая, что как раз за советами я сюда и вернулся вообще.
От каких это своих слов я отказываюсь? Вот ваши догадки я действительно не принимаю за свои слова и не буду принимать как бы этого кому не хотелось. Как раз полезной информации теперь уже в двух темах сущие крупицы.
Хакер писал(а):Помимо того, что это выглядит глупо, это ещё и совершенно непродуктивно. Твоё дело меньше возражать, больше слушать и впитывать информацию, а не после каждого исправления возражать «да вообще-то я так и думал, я это и имел в виду, вы не подумайте!».
После каждого исправления я не возражаю, а благодарю. Да вообще-то я так НЕ говорил и НЕ думал, а точно знал, что использую позднее связывание. Повторюсь, я об этом так и написал. А ты решил из этого выдумать мою ошибку.
Хакер писал(а):
Adam Smith писал(а):
Код: Выделить всё
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    objHTTP.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) = True

Где тут признаки позднего связывания?
окей, где в твоём вопросе ну хотя бы исправление ошибки которую ты себе придумал? И об этом ты говоришь, как об исправлении и негодуешь! Помимо того, что отвечать вопросом на вопрос выглядит глупо, это ещё и контрпродуктивно.
Но только если цель получить продукт, а если конечная цель противоположна, то очень даже уместная, эффективная и провокационная манера.
такой коэффициент полезной информации подтверждает то, что я говорил гораздо раньше, ничего тут не изменилось за прошедшие годы

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.01.2016 (Ср) 14:18

Хакер писал(а):Где тут признаки позднего связывания?

Ну при особом желании, если сделать Option Explicit Off, то они там всё-таки могут оказаться в виде неявного объявления переменной.

Adam Smith писал(а):Ну даже если бы я объявил переменную как вариант это ни разу не делает позднее связывание ранним.

А если бы ты её объявил как некоторый интерфейс, но при этом оставил CreateObject?

Adam Smith писал(а):CreateObject я очевидно использую потому, что не подключил WinHTTP в референсах.

Тебе хотели сказать, что CreateObject не означает позднего связывания, а только объявление переменной имеет значение.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 13.01.2016 (Ср) 15:32

ок

Уж как нибудь простите что не показывая декларацию объекта я просто написал "использую позднее связывание". Не подумал, что всё так уныло, хотя конечно нужно было помнить о минном поле, саперах и т.д. и т.п.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 15.01.2016 (Пт) 23:18

Когда результат мне нужен в байтмассиве, а WinHTTP возвращает BSTR
Код: Выделить всё
HRESULT GetResponseHeader(
  [in]          BSTR Header,
  [out, retval] BSTR *Value
);
остается только конвертировать. Правильно я понимаю?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Хакер » 15.01.2016 (Пт) 23:32

BSTR — это String в VB.
Ничего конвертировать не нужно. Правильно тебя поняли?

Кроме того, под WinHTTP понимается не только ООП-обёртка, предоставляемая этой библиотекой, но и набор обычных процедурных API-функций, где тебе придётся работать с голыми массивами, если суть хотелки именно в этом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Следую совету, заодно узнаю на сколько это полезно

Сообщение Adam Smith » 16.01.2016 (Сб) 0:37

Не правильно. Под WinHTTP в данном случае я имею ввиду тот объект, с которым работаю (как внезапно выяснилось) посредством позднего связывания.
Т.к. данных, которые нужно хранить и передавать, может быть много, то для экономии памяти я хочу результат BSTR конвертировать соответственно данным
Код: Выделить всё
objHTTP.GetResponseHeader("Content-Type")    в Byte
objHTTP.GetResponseHeader("Content-Length")  в Long 'или в Decimal
objHTTP.GetResponseHeader("Last-Modified")   в Date
суть хотелки была в этом. Cреди API-функций есть такая, которая вернет мне данные конкретных Response Headers как это делает обертка? Думаю нет.

След.

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 74

    TopList