powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / FtpGetFile - отслеживание процесса копирование
20 сообщений из 20, страница 1 из 1
FtpGetFile - отслеживание процесса копирование
    #34265432
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток господа !

Случаем не приходилось отслеживать процесс копирование через Ftp протокол
Хочу визуализировать это процесс через ProgressBar
Подкиньте код !!

Спасибо !
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34266037
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве на VB можно делать колбеки?
В принципе, надо использовать функцию InternetSetStatusCallback, передать ей адрес своей функции формата InternetStatusCallback и будешь получать описание что происходит внутри wininet функций.
Но на VB мне кажется это не сделать. Зато можно сделать dll-ку или ActiveX, вынести всю работу с wininet в нее, и можно будет жить даже в VB :)
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34266770
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на vbip.com есть класс на базе Winsocket в котором есть Progress бесплатная, со всеми исходниками
я им и пользуюсь, проблем не было
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34267123
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlА разве на VB можно делать колбеки?

А с какого бодуна ты решил что нельзя?
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34267700
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарен за общение
White_Owl - идею с InternetSetStatusCallback понял, воспользуюсь !

Orunbek - с Vbip.com ознакомился, а FtpClient класс где-то скопировать
можно (по сайту не нашел.... пардон может не туда смотрел)
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34267834
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да... у них поиск тормознутый
можно googl'ом
FTP site:vbip.com

находит сразу
The FTP client Visual Basic source code library
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34269258
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF White OwlА разве на VB можно делать колбеки?
А с какого бодуна ты решил что нельзя?А что можно?
Ну покажи мне тогда, конкретный синтаксис уже упомянутой задачи: повесить колбек на wininet функции.
Я знаю как сделать это на С, но не знаю как на VB. Научи меня.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34269475
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И попутно - где можно найти значение флагов API

Например MSDN утверждает что функция FtpGetFile может работать
асинхронно - для это необходимо задать флаг
INTERNET_FLAG_ASYNC - а которое его значение ?????
(и огласите весь список - ПОЖАЛУЙСТА....INTERNET_FLAG_CACHE_ASYNC,... и т.д.)
Если не ошибаюсь при создании указателя
hSoft = InternetOpen("OUTLOOK",1,vbNullString,vbNullString, INTERNET_FLAG_ASYNC )

А если необходимо работа не всей группы функций этого указателя, а только
процесса копирования (FtpGetFile) ? Cоздавать отдельный поток ?
Или можно сделать асинхронной только одну функцию ?
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34269512
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XИ попутно - где можно найти значение флагов APIВ API :)
Смотри wininet.h там они все перечислены.
Лучше всего, выкачай себе psdk, там вообще самое полное описание API, но если лениво, ходи сюда:
http://search.cpan.org/src/JDB/libwin32-0.26/Internet/WININET.H

HOME_XНапример MSDN утверждает что функция FtpGetFile может работать асинхронно
....
А если необходимо работа не всей группы функций этого указателя, а только процесса копирования (FtpGetFile) ? Cоздавать отдельный поток ?
Или можно сделать асинхронной только одну функцию ?Нет. Если "главный" хендл открыл синхронными или асинхронным, все его потомки будут синхронными или асинхронными соотвественно. Переключаться на ходу нельзя.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #34271651
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарен за участие и помощь господа !
Относительно колбека - сделал переадресацию на свой тип
Ошибки нет, но эффекта тоже ????!!!!

AndrF "А с какого бодуна ты решил что нельзя?"
Уверен что это возможно ? Можно увидеть код
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FtpGetFile - отслеживание процесса копирование
    #37012428
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и?
Using WinInet APIs Asynchronously Within Visual Basic
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
' flags for InternetOpen():
Private Const INTERNET_FLAG_ASYNC = &H10000000              ' this request is asynchronous (where supported)
Private Declare Sub InternetSetStatusCallback Lib "wininet.dll" (ByVal hInternetSession As Long, ByVal lpfnCallBack As Long)

Public Function SendAPIRequest2(ByVal strUrl As String) As String
    Dim hOpen As Long, hFile As Long
    Dim Ret As Long, sBuffer As String *  128 
    Dim iResult As Integer, sData As String
    hOpen = InternetOpen("VB Program",  1 , vbNullString, vbNullString, INTERNET_FLAG_ASYNC)
    If hOpen =  0  Then
        MsgBox "Error opening Internet connection"
        Exit Function
    End If
    InternetSetStatusCallback hOpen, AddressOf MyCallBack
.....
Sub MyCallBack( _
  ByVal hInternet As Long, _
  ByVal dwContext As Long, _
  ByVal dwInternetStatus As Long, _
  ByVal pbStatusInformation As Long, _
  ByVal dwStatusInformationLength As Long)

    ' Callback routine implementation.
    Debug.Print "Status: " & dwInternetStatus
End Sub
Получилось у кого-нибудь?
У меня в CallBack тишина. Гребаным контролом
Microsoft Internet Transfer Control 6.0 (SP6)
пользоваться нехочецца
а проблема налицо:
Приконнектиться к сайту и чего-нибудь считать
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37012479
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну и?
Код: plaintext
Private Declare Sub InternetSetStatusCallback Lib "wininet.dll" (ByVal hInternetSession As Long, ByVal lpfnCallBack As Long)
Во первых, это function а не sub. Возврат проверять полезно...

Дмитрий77
Код: plaintext
InternetSetStatusCallback hOpen, AddressOf MyCallBack
Во вторых, в показанном коде нету ни одной функции которые в принципе могли бы позвать колбек...

А так, все вроде правильно пока. Хотя я предпочитаю вешать колбек на соединение а не на библиотеку целиком.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37012537
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Я такие заумные коды писать не умею. Тупой, все.
Но умею находить.
И уже нашел, и хорошего качества:
http://www.vbnet.ru/forum/show.aspx?id=69610
(Номер ответа: 7)
Причем реально рабочий.
Но глючит.
Например надо прочитать текстовой файл:
www.myserver.com/downloads/file.txt

Меняем там:
Код: plaintext
1.
2.
3.
4.
Private Const szSvrName As String = "www.myserver.com"

Private Sub Command1_Click()
     MsgBox SendRequest("/downloads/file.txt")
End Sub
Он этот файл иногда выводит, иногда нет.
При этом может подвиснуть.
А если скомпилировать, то exe-шник вылетает.

Сумеете допилить? Я врядли, как бы вы меня не пытались учить.

Если сумеете (при вашем уровне думаю да если это в принципе возможно), то код в студию.

Если нет, то давайте вместе согласимся с тем что пишут умные люди.
INFO: Using WinInet APIs Asynchronously Within Visual Basic
MicrosoftIt should be noted that Microsoft does not recommend using WinInet in Visual Basic in an asynchronous mode. It should also be noted that Microsoft does not support such use.

Потому что сутки лазить по интернету и видеть там только вздохи и всхлипы, что ни фига ни у кого не работает и не работало (в vb6), сопряженные с умными советами чего надо и ссылками на C++ мне надоело, чему данный топик поднятый со дна суть подтверждение. Так что приведенная ссылка это последний случайный шанс. Но код в том виде как есть глючный.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37012571
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее надо допиливать найденный код (в VB среде он почти рабочий) следующим образом.
1.Идейно Руководствоваться статьей
Using WinInet HTTP functions in Full Asynchronous Mode
2. Вылетает он скорее всего из за игнорирования автором хорошего кода того о чем пишет Microsoft, т.е.
must use a declaration like below:
Код: plaintext
1.
2.
3.
4.
  Public Declare Function InternetReadFile Lib "wininet.dll" ( _
      ByVal hFile As Long, _
      ByVal sBuffer As Long, _
      ByVal lNumBytesToRead As Long, _
      lNumberOfBytesRead As Long) As Integer
The difference is that instead of passing a String data type, you are actually passing the memory address of the newly allocated buffer.
Видимо именно по этим причинам CopyMemory и дает сбой в exe, хотя как-то и б.м. вытягивает в VB-среде.

По идее предложенная в статье 1 InternetReadFileEx должна исправить ошибку допущенную в 2.
Я сумел только накопать/родить какие-то куски:

Код: plaintext
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.
Private Type INTERNET_BUFFERS
  dwStructSize    As Long   'DWORD              // Unsigned long integer value used for API versioning. This is set to the size of the INTERNET_BUFFERS structure.
  Next            As Long   'INTERNET_BUFFERS * // Address of the next INTERNET_BUFFERS structure. (Use the VB "VarPtr" function to get the address of the INTERNET_BUFFERS variable to pass to this member)
  lpcszHeader     As String 'LPCTSTR            // Address of a string value that contains the headers. This value can be NULL.
  dwHeadersLength As Long   'DWORD              // Unsigned long integer value that contains the length of the headers, in TCHARs, if lpcszHeader is not NULL.
  dwHeadersTotal  As Long   'DWORD              // Unsigned long integer value that contains the size of the headers if there is not enough memory in the buffer.
  lpvBuffer       As Long   'LPVOID             // Address of the data buffer.
  dwBufferLength  As Long   'DWORD              // Unsigned long integer value that contains the length of the buffer, in TCHARs, if lpvBuffer is not NULL.
  dwBufferTotal   As Long   'DWORD              // Unsigned long integer value that contains the total size of the resource.
  dwOffsetLow     As Long   'DWORD              // Unsigned long integer value that is used for read ranges.
  dwOffsetHigh    As Long   'DWORD              // Unsigned long integer value that is used for read ranges.
End Type

' Constants - InternetReadFileEx.dwFlags
Private Const IRF_ASYNC = &H1       ' Undocumented
Private Const IRF_SYNC = &H4        ' Undocumented
Private Const IRF_USE_CONTEXT = &H8 ' Undocumented
Private Const IRF_NO_WAIT = &H8     ' Do not wait for data. If there is data available, the function returns either the amount of data requested or the amount of data available (whichever is smaller).


Private Declare Function InternetReadFileEx Lib "WININET.DLL" Alias "InternetReadFileExA" (ByVal hFile As Long, ByRef lpBuffersOut As INTERNET_BUFFERS, ByVal dwFlags As Long, ByVal dwContext As Long) As Long   'BOOL

Private Sub InternetCallbackFunc(ByVal hInternet As Long, ByVal dwContext As Long, _
                                                          ByVal dwInternetStatus As Long, _
                                                          ByVal pbStatusInformation As Long, _
                                                          ByVal dwStatusInformationLength As Long)
...
    Const BufLen As Long =  1024 
    Dim OutBuffer As INTERNET_BUFFERS
    Dim Buffer( 0  To BufLen -  1 ) As Byte
    ' Set up return buffer structure
    OutBuffer.dwStructSize = Len(OutBuffer)
    OutBuffer.dwBufferLength = BufLen
    OutBuffer.lpvBuffer = VarPtr(Buffer( 0 ))
...
                    Do Until InternetReadFileEx(hInternet, OutBuffer, IRF_ASYNC,  0 &) =  0 & '???
                        'If lng = 0& Then
                        If OutBuffer.dwBufferLength =  0 & Then
                            stContext.dwExitFlag = vbNull
                            Exit Do
                        Else
                            'sOutBuffer = sOutBuffer & Left$(szTmpBuffer, lng)
                            sOutBuffer = sOutBuffer & Left$(OutBuffer.dwBufferTotal, OutBuffer.dwBufferLength) '???
                        End If
                    Loop

Нет, мне не по зубам...

Уже думаю наплевать и использовать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Private Sub cmdGet_Click()
    Inet1.Execute txtFile.Text, "GET"
End Sub

Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim var_data As Variant
Dim str_data As String
Debug.Print State
    If State = icResponseCompleted Then
        ' Get the first chunk.
        var_data = Inet1.GetChunk( 1024 , icString)
        str_data = str_data & var_data

        ' Get the rest of the chunks.
        Do
            DoEvents
            var_data = Inet1.GetChunk( 1024 , icString)
            If Len(var_data) =  0  Then Exit Do
            str_data = str_data & var_data
        Loop

        txtResults.Text = str_data
    End If
End Sub
Этот код делает то самое желаемое асинхронное действо, и не завешивает прогу при долгом ожидании(как при синхронном API-режиме).
Одна беда-контрол несчастный за прогой таскать.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37014232
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Причем реально рабочий.
Но глючит.На первый взгляд там все правильно написано, нечему глючить.
Добавь отладочных сообщений в колбек и посмотри внимательнее в какие моменты оно у тебя хулиганит. Скорее всего неусточивая сеть...

Дмитрий77Сумеете допилить? Я врядли, как бы вы меня не пытались учить.

Если сумеете (при вашем уровне думаю да если это в принципе возможно), то код в студию.Неа, не сумею. У меня VB6 нету :)
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37014373
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
White Owl...в какие моменты оно у тебя хулиганит. Скорее всего неусточивая сеть...
думаю оно таки нормально себя ведет.
Асинхронность нужна именно для "неустойчивой" сети:
Приконнектиться к сайту и чего-нибудь считать
Эту тему хоть читали, с чего бы я вдруг в такие дебри и мертвеца еще вдобавок откопал...
Скорее всего м.б. код там и нормальный...
Думаю я дергаю кнопку
Код: plaintext
1.
2.
Private Sub Command1_Click()
     MsgBox SendRequest("/downloads/file.txt")
End Sub
не дождавшись конца (icResponseCompleted/icError в переводе на Inet1) и не закрыв хэндлы, и это не на smallfile.txt а на bigpage.html. Или например при тесте, "когда долго коннектится" не дождавшись этих 10секунд.
Ну т.е. во пример не вполне врубился, а от этого и Inet1 вылетит, не то что API.

Но Вы не поняли: когда запускаешь кнопку (даже в первый раз) в откомпилированном exe, прога валится (и будет закрыта) с предложением сообщить туда-то, и виновата msvbvm60.dll.
И понятно что работать на таких условиях с этим кодом нельзя.

Поэтому пока я заменил в проге у себя API на Inet1 контрол, хоть и очень не хотел.

М.б. тест-проект аккуратно еще раз сделать и выложить?
Пусть "спецы" посмотрят что не так.
Если честно обидно за код, потому что этот коллбек на vb6 на каждом углу в инете не валяется, везде одни вопли и плачи на эту тему.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37014451
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Думаю я дергаю кнопку
Код: plaintext
1.
2.
Private Sub Command1_Click()
     MsgBox SendRequest("/downloads/file.txt")
End Sub
не дождавшись конца (icResponseCompleted/icError в переводе на Inet1) и не закрыв хэндлы, и это не на smallfile.txt а на bigpage.html. Или например при тесте, "когда долго коннектится" не дождавшись этих 10секунд.Ну это как раз легко поправить.
Добавь в обработчик кнопки заперет самой кнопки а в колбек по окончанию приема файла разрешение кнопки.


Дмитрий77Но Вы не поняли: когда запускаешь кнопку (даже в первый раз) в откомпилированном exe, прога валится (и будет закрыта) с предложением сообщить туда-то, и виновата msvbvm60.dll.В какой момент валится? Разбросай по коду отладочные сообщения. Пусть они пишут в файл "достиг точки 123", "достиг точки 124" и тд. Потом посмотри после какой точки произошел GPF.
Скорее всего ты где-то забыл проинициализировать приемный буффер...

PS, не надо мне выкать. Я один человек а не группа товарищей.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37014880
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДмитрий77Думаю я дергаю кнопку
Код: plaintext
1.
2.
Private Sub Command1_Click()
     MsgBox SendRequest("/downloads/file.txt")
End Sub
не дождавшись конца (icResponseCompleted/icError в переводе на Inet1) и не закрыв хэндлы, и это не на smallfile.txt а на bigpage.html. Или например при тесте, "когда долго коннектится" не дождавшись этих 10секунд.Ну это как раз легко поправить.
Добавь в обработчик кнопки заперет самой кнопки а в колбек по окончанию приема файла разрешение кнопки.
Не, это я себя обнадежил. Дело не в этом и точно не в плохом коннекте. Там с буферами и т.п. думаю беда полная, оно на нек. страницах весится капитально по непонятному принципу и с недожиданием это никак не связано.

White OwlДмитрий77Но Вы не поняли: когда запускаешь кнопку (даже в первый раз) в откомпилированном exe, прога валится (и будет закрыта) с предложением сообщить туда-то, и виновата msvbvm60.dll.В какой момент валится? Разбросай по коду отладочные сообщения. Пусть они пишут в файл "достиг точки 123", "достиг точки 124" и тд. Потом посмотри после какой точки произошел GPF.
Скорее всего ты где-то забыл проинициализировать приемный буффер...
Пока первая часть не разрулится к этой переходить рано.

White OwlPS, не надо мне выкать. Я один человек а не группа товарищей.
Извини, не привык тыкать людям, которые как мне кажется заслуживают уважения.
Потыкать могу на CИ-шной ветки форума, куда сдуру как то зашел и встретил извините в основном козлов, если не в плане знаний, то по крайней мере в плане манер их ответов.

Короче даю проект "как есть", т.е. без собственных "приработок", глядишь кто и взглянет опытный (у кого VB6 еще установлен). По умолчанию он коннектится на index mail.ru, там как раз он якобы не глючит в VB среде.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37014882
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всяк. случай еще умный модуль в догрузку, если кто решит копаться.
...
Рейтинг: 0 / 0
FtpGetFile - отслеживание процесса копирование
    #37014883
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри,
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / FtpGetFile - отслеживание процесса копирование
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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