biblioteka DLL pobierająca plik z Internetu [HELP]

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Dlaczego mi to nie działa? Tzn. w momencie załadowania biblioteki przez program biblioteka nie pobiera pliku z Internetu?

Kod:
library download;
uses
  Windows,
  Urlmon;

procedure DllMain(reason: integer) ;
begin
   case reason of
   DLL_PROCESS_ATTACH:
     begin
       MessageBox(0, 'Downloading started!', 'DLL_PROCESS_ATTACH', MB_OK);
       UrlDownloadToFile(nil, 'http://www.google.pl/images/srpr/logo4w.png', 'C:\logo.png', 0, nil);
       MessageBox(0, 'Downloading finished!', 'DLL_PROCESS_ATTACH', MB_OK);
     end;
   DLL_PROCESS_DETACH:
     begin
       MessageBox(0, 'Unloading DLL!', 'DLL_PROCESS_DETACH', MB_OK);
     end;
   end;
end; (*DllMain*)

begin
   MessageBox(0, 'begin... ', ' DLL! ', MB_OK);
   DllProc := @DllMain;
   DllProc(DLL_PROCESS_ATTACH);
   //more DLL code here...
end.

Ewentualnie, jak w inny sposób "zmusić" bibliotekę dll żeby pobrała plik?
 
Ostatnia edycja:

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Kod kompiluje się. W momencie załadowania biblioteki przez program pojawia się pierwszy MessageBox(0, 'begin... '..., nastepnie pojawia się drugi MessageBox(0, 'Downloading started!'... i cisza, nic się nie dzieje. Próbowałem też z UrlDownloadToFileA i to samo - czyli nic. Próbowałem też inną metodę pobierania pliku - z pomocą klasy WinInet i też nie pobiera pliku. Wspomniane sposoby działają z pliku exe ale z biblioteki dll nie chcą działać.

http://msdn.microsoft.com/en-us/library/ms775123(v=vs.85).aspx
 
Ostatnia edycja:

meViu

Użytkownik
Dołączył
Kwiecień 8, 2013
Posty
223
Obstawiam, że twój program nie ma wystarczających uprawnień do zapisu pliku bezpośrednio na dysku C. Spróbuj zapisywać plik w lokalizacji, w której znajduje się dll'ka i napisz czy to coś zmieniło.
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
nic to nie zmienia. Zrobilem tez inną dll'kę do ktorej dodałem plik jako resource i biblioteka 'wypakowuje' z siebie ten plik i zapisuje na dysku także co do uprawnień do zapisu wszystko jest ok. Może trzeba pierwszy parametr w funkcji URlDonwloadToFile dać jakiś inny niż nil? Szukałem na googlach i ktośteż miał problem z tąfunkcją - tzn. nie dzialala odpalona z biblioteki.
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Dzięki. Posłużyłem się tym http://www.delphibasics.info/home/delphibasicssnippets/winsockdownloader downloader'em opartym na Winsock. Biblioteka pobiera plik. Ale wywala kilka komunikatów o błędach. Tzn. ten downloader skompilowany do exe wywala te blędy jak i kod downloadera dodany do dll też wywala te same błędy.errors.JPG

Jak się pozbyć tych komunikatów o błędach (poprawić kod)? Lub czy można jakoś z poziomu biblioteki dll zablokować wyświetlanie komunikatów o błedach tak jak to można zrobić w programach exe -> Application.OnException := MyAppException;
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
przypadkowo dodałem do uses klase Dialogs i teraz nie ma żadnych błędów ale rozmiar skompilowanego pliku zwiększył o się o 300KB :eek:
 

crazyferajna

Użytkownik
Dołączył
Listopad 25, 2010
Posty
144
Sprawdź moją funkcję, którą kiedyś napisałem.

Kod:
function URLDownloadToFile(const URL: String; FileName: String):boolean;
var
  Buffer : array[1..1024] of Byte;
  hSession, hURL : HINTERNET;
  dwRead : DWORD;
  F : File;
  pBuf : Pointer;
  dwBufLen : DWORD;
  dwIndex : DWORD;
begin
  hSession := InternetOpen(NET_HEADER,
                           INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession, PChar(URL), nil, 0, 0, 0);
    dwBufLen := 1024;
    dwIndex := 0;
    GetMem(pBuf, dwBufLen);
    HttpQueryInfo(hURL, HTTP_QUERY_CONTENT_LENGTH,
                              pBuf, dwBufLen, dwIndex);
    FreeMem(pBuf, dwBufLen);
    try
      AssignFile(F, FileName);
      try
        Rewrite(F, 1);
        repeat
          InternetReadFile(hURL, @Buffer, SizeOf(Buffer), dwRead);
          BlockWrite(F, Buffer, dwRead);
        until dwRead = 0;
      finally
        CloseFile(F);
      end;
    finally
      InternetCloseHandle(hSession);
    end;
  finally
    InternetCloseHandle(hURL);
  end;
  Result := true;
end;
 

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Error: niezdefiniowany identyfikator: NET_HEADER .... dałem to w cudzysłów , skopilowało się ale nie działa, nie pobiera pliku.

Trzeba jeszcze dodać do uses WinInet. Miałem podobny downloader oparty o WinInet i też nie działał. Może chodzi o ten parametr NET_HEADER zeby dać coś innego niż ja dałem. Normalnie w programie exe to daje tam PChar(application.title) ale w dll'u nie można tego dodać bo dll nie jest aplikacją.... ale chyba nie ma to większego znaczenia bo to tylko wskaźnik do stringa -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx

W każdym razie działa mi pobieranie z kodem korzystającym tylko z winsock, który dałem wczesniej.

Dodałem do dll'ki do uses wszystkie klasy jakie są w exeku i też nie działa. Widocznie te funkcje nie działają z poziomu dll.
 
Ostatnia edycja:

crazyferajna

Użytkownik
Dołączył
Listopad 25, 2010
Posty
144
to jest nagłowek, ktory jest wysylany do serwera w żądaniu do pliku, może być doowlny

btw. czemu delphi? i co to za wersja IDE?
 
Ostatnia edycja:

msvcrt

Użytkownik
Dołączył
Październik 15, 2011
Posty
71
Mam delphi 7 Enterprise. Bo umiem trochę pisać w pascalu więc dlatego delphi.
 
Do góry Bottom