FTP: Wininet i InternetSetStatusCallback

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

FTP: Wininet i InternetSetStatusCallback

Nowy postprzez mckri » poniedziałek, 16 sierpnia 2010, 21:44

Witam.
Jeżeli chodzi o obsługę sciagania plików z ftp przez bibliotekę wininet to nie mam pytań. Przy małych plikach aplikacja sobie radzi bez zarzutu. Jednak przy dużych plikach (>kilkudziesięciu MB) pobranie pliku z FTP zajmuje już trochę czasu. Problem mam tego rodzaju, że program w tym momencie dla użytkownika wydaje się byc nieaktywny. Czytałem, że można wykorzystać "InternetSetStatusCallback" jednak na samych deklaracjach funkcji w MSDN nie jestem w stanie sklecić kodu w całość - niestety. Czy ktoś z was podrzuciłby rozwiązanie problemu przechwytywania komunikatów pobierania kolejnych części pliku z ftp, tak aby użytkownik wiedział, że aplikacja faktycznie pracuje?
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaInternet Explorer 8

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez Cyfrowy Baron » wtorek, 17 sierpnia 2010, 09:56

Jeżeli chodzi o obsługę sciagania plików z ftp przez bibliotekę wininet to nie mam pytań


Więc pozostaje ci tylko dodać wspomnianą funkcję. Opis szczegółowy jest tutaj: Creating Status Callback Functions. Jest tam wszystko co potrzebne do podłączenia tej funkcji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez polymorphism » wtorek, 17 sierpnia 2010, 11:39

Możesz też użyć funkcji FtpOpenFile, FtpGetFileSize i InternetReadFile, pisząc własną procedurę ściągającą plik.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez MisticFrezer » środa, 18 sierpnia 2010, 12:47

Akurat nad tym pracuję, więc dam Tobie od razu gotowca:
Kod: Zaznacz cały
HINTERNET hTransfer = NULL;

char Buffer[4096];
DWORD  dwBytesAvailable = 0;
DWORD  dwRead = 0;
bool bActive = true, fSuccess = false;

HANDLE hFileDownload = NULL;

// Otwieramy transfer
hTransfer = FtpOpenFile(FTPHandle, "online.txt", GENERIC_READ,
   FTP_TRANSFER_TYPE_BINARY, 0);

// Otwieramy plik
hFileDownload = CreateFile("offline.txt", GENERIC_WRITE, 0,
   NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

do
{
   fSuccess = InternetReadFile(hTransfer, Buffer, 4096,
     &dwRead);

   if(!fSuccess || dwRead == 0) {
      bActive = false;
      break;
   }

   // Wzapisz bufor
   DWORD dwWritten = 0;
   WriteFile(hFileDownload, Buffer, dwRead, &dwWritten, NULL);
   dwRead = 0;
}
while(bActive);

CloseHandle(hFileDownload);
InternetCloseHandle(hTransfer);

Zakłądam, ze jestes juz połączony z serwerem FTP.

Za ten post autor MisticFrezer otrzymał podziękowanie od:
mckri
Avatar użytkownika
MisticFrezer
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): wtorek, 23 lutego 2010, 23:57
Lokalizacja: Wrocław
Podziękował : 1
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP3, Windows 7 Pro
Kompilator: BCB6, RAD Studio 2010, VS 2010
Gadu Gadu: 0
    Windows XPOpera

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez Cyfrowy Baron » czwartek, 19 sierpnia 2010, 08:45

:oops: Dopiero teraz zwróciło to moją uwagę:

mckri napisał(a):Problem mam tego rodzaju, że program w tym momencie dla użytkownika wydaje się byc nieaktywny.


Funkcja o której wspominasz problemu raczej nie rozwiąże, gdyż pobieranie plików powinieneś realizować w odrębnym wątku, tak by nie blokować, głównego wątku aplikacji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez mckri » czwartek, 19 sierpnia 2010, 15:46

Hmm, akurat wykorzystywałem do tej pory tylko funkcje FtpGetFile.
Sprawdzę w najbliższym czasie Twój sposób MisticFrezer. Dzieki.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaInternet Explorer 8

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez mckri » piątek, 20 sierpnia 2010, 08:30

MisticFrezer, twój kod mi bardzo pomógł. Wstawiłem tylko w pętlę Application->ProcessMessages() i po problemie.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaInternet Explorer 8

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez Cyfrowy Baron » piątek, 20 sierpnia 2010, 09:19

Odświeżanie kolejki komunikatów ( ProcessMessages ) tylko w niewielkim stopniu rozwiązuje problem, gdyż aplikacja po prostu w każdym obiegu pętli pozwala wykonać inne proste operacje, ale wszystko odbywa się w jednym wątku, więc nie da się wykonać w ten sposób bardziej złożonych operacji, gdyż może wystąpić błąd z pobieraniem pliku. Jeżeli jest to klient FTP, który poza pobieraniem lub wysyłaniem pliku nic innego w tym czasie nie musi robić, to rozwiązanie jest wystarczające, jeżeli jednak jest to coś w stylu przeglądarki, to jedynym rozwiązaniem jest zastosowanie wątków.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez mckri » piątek, 20 sierpnia 2010, 10:09

Jest to program w sensie automatycznego aktualizatora plików, który może pobierac pliki z zasobów sieciowych lub ftp. Nic poza tym nie wykonuje.

Problem z ftp z pobieraniem duzych plików mam juz rozwiązany. Jednak teraz zastanawia mnie problem z kopiowanie duzych plików lokalnie lub z udostepnionych zasobów sieciowych. Obecnie wykorzystuję zwykłe CopyFile. Jednak czy można tutaj uzyć bardziej zaawansowanych funkcji winapi, np. readfile i writefile, w której równiez po odczytaniu porcji danych będzie mozna dodać ProcessMessages? Przykład zastosowania mile widziany :)
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaInternet Explorer 8

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez Cyfrowy Baron » piątek, 20 sierpnia 2010, 14:04

Jak rozumiem chcesz ominąć problem z blokowaniem programu podczas kopiowania dużych plików. Rozwiązaniem jest oczywiście umieszczenie procesu kopiowania w odrębnym wątku, tak robi większość dobrych programów jak chociażby Total Commander, który oferuje dwie metody kopiowania, standardową podczas której program pozostaje zablokowany do czasu zakończenia kopiowania, oraz metodę opartą na odrębnym wątku, program nie jest blokowany.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez mckri » piątek, 20 sierpnia 2010, 14:18

Ok, skoro tak mówisz. Mam juz kilka wątków w aplikacji i chciałem tą najważnieszą funkcjonalność zatrzymać w głównym.
Temat do zamknięcia.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: FTP: Wininet i InternetSetStatusCallback

Nowy postprzez Cyfrowy Baron » piątek, 20 sierpnia 2010, 14:36

Funkcjonalność powinna chyba dotyczyć całej aplikacji a nie jej wybranej funkcji. Skoro kopiowanie w tle (w oddzielnym wątku) sprawia, że aplikacja jest funkcjonalna to takie rozwiązanie jest najlepsze.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość