Страница 1 из 2

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

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

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

СообщениеДобавлено: 07.01.2016 (Чт) 22:18
Proxy
Вырвано из контекста, ничего не понятно.
В чем вообще задача?
Речь о VB6?

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

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

СообщениеДобавлено: 08.01.2016 (Пт) 4:01
Qwertiy
Много форм не означает много потоков - поток по-прежнему один.
А всё остальное - да.

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

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

СообщениеДобавлено: 08.01.2016 (Пт) 4:33
Adam Smith
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

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

СообщениеДобавлено: 08.01.2016 (Пт) 12:28
alibek
Adam Smith, хватит уже ерундой заниматься.
В другом топике тебе дали более чем достаточно информации для решения задачи.
Если для тебя это слишком сложно, то не трогай сокеты и низкоуровневые инструменты.
Подключи библиотеку Microsoft WinHTTP (которая входит в состав ОС начиная не то с W2k, не то с WXP) и используй ее.

СообщениеДобавлено: 08.01.2016 (Пт) 14:13
Qwertiy
Adam Smith писал(а):Java ?

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

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

СообщениеДобавлено: 08.01.2016 (Пт) 15:45
Хакер
Qwertiy только и агитирует за дотнет. :)

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

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

СообщениеДобавлено: 08.01.2016 (Пт) 15:52
Adam Smith
Нашел, Хакер упоминал WinHTTP, там есть готовые функции. Заниматься ерундой это про код формы? Ну использую другие апи, но форма всё равно нужна.
И всё равно нужно грузить кучу инстансов формы, чтобы за одно и тоже время параллельно получать данные по десяткам ссылок.

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

СообщениеДобавлено: 08.01.2016 (Пт) 16:51
Qwertiy
Хакер писал(а):Qwertiy только и агитирует за дотнет. :)

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

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

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

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

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

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

СообщениеДобавлено: 08.01.2016 (Пт) 17:11
Adam Smith
Блин, нормального примера не найду никак.

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

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

СообщениеДобавлено: 10.01.2016 (Вс) 2:29
Adam Smith
Зависают классы, как-то рандомно. Более менее выполняет когда даю сервер с содержимым типа этого:
Код: Выделить всё
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
........................................................................................
На обычных сайтах всё гораздо хуже. Если бы всегда одна и та же ссылка вешала было бы понятно.
Всё таки нужны потоки и нужно как-то возвращаться к байт-массивам, строки память едят нещадно.

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

СообщениеДобавлено: 10.01.2016 (Вс) 11:24
alibek
Adam Smith писал(а):Зависают классы, как-то рандомно.

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

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

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

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

СообщениеДобавлено: 10.01.2016 (Вс) 21:24
Adam Smith
Увидеть бы как правильно, ато истина никак мне не приснится, яблоко не падает, озарения нет, муза в отпуске, стимуляторы не использую и архитектор плохой.
Ну ты крутой, раз у тебя ТАКИЕ знакомые. Правильно я понял?) Или имелось ввиду, что он тоже под 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, не так много.

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

СообщениеДобавлено: 10.01.2016 (Вс) 21:27
Хакер
Adam Smith писал(а):
Код: Выделить всё
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
    objHTTP.Option(WinHttpRequestOption_EnableHttpsToHttpRedirects) = True

Где тут признаки позднего связывания?

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

СообщениеДобавлено: 11.01.2016 (Пн) 10:11
Adam Smith
Там же где и тут 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 и основную сборку взаимодействия.

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

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

СообщениеДобавлено: 11.01.2016 (Пн) 10:13
Хакер
Что ты этим хотел сказать?

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

СообщениеДобавлено: 11.01.2016 (Пн) 10:16
Adam Smith
А ты что хотел спросить?

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

СообщениеДобавлено: 11.01.2016 (Пн) 10:23
Хакер
Чтобы ты показал, где в выложенном тобою коде признаки позднего связывания. А не процитировал мне наспех найденный переведённый фрагмент доки с MSDN.

СообщениеДобавлено: 11.01.2016 (Пн) 18:30
Qwertiy
Adam Smith писал(а):Там же где и тут https://msdn.microsoft.com/ru-ru/library/7t9k08y5(v=vs.90).aspx

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

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

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

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

СообщениеДобавлено: 12.01.2016 (Вт) 12:56
Хакер
Adam Smith писал(а):Ну даже если бы я объявил переменную как вариант это ни разу не делает позднее связывание ранним.

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

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

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

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

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

Откуда тогда взялась константа WinHttpRequestOption_EnableHttpsToHttpRedirects? Не уж-то вручную объявил?

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

СообщениеДобавлено: 12.01.2016 (Вт) 12:59
Adam Smith
Андерстэнд? Толпы заблуждающихся, я у вас спрашиваю)), надеюсь сервер то выдержит ответ этой толпы.
Код: Выделить всё
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

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

СообщениеДобавлено: 12.01.2016 (Вт) 13:07
Хакер
Я не понимаю, почему ты ехидничаешь?

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

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

Помимо того, что это выглядит глупо, это ещё и совершенно непродуктивно. Твоё дело меньше возражать, больше слушать и впитывать информацию, а не после каждого исправления возражать «да вообще-то я так и думал, я это и имел в виду, вы не подумайте!».

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

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

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

СообщениеДобавлено: 13.01.2016 (Ср) 14:18
Qwertiy
Хакер писал(а):Где тут признаки позднего связывания?

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

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

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

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

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

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

СообщениеДобавлено: 13.01.2016 (Ср) 15:32
Adam Smith
ок

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

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

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

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

СообщениеДобавлено: 15.01.2016 (Пт) 23:32
Хакер
BSTR — это String в VB.
Ничего конвертировать не нужно. Правильно тебя поняли?

Кроме того, под WinHTTP понимается не только ООП-обёртка, предоставляемая этой библиотекой, но и набор обычных процедурных API-функций, где тебе придётся работать с голыми массивами, если суть хотелки именно в этом.

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

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