Помогите разобраться. Проверил и перепроверил все что можно, но этот загрузчик файлов неработает! По всей видимости ошибка где-то рядом с InternetReadFile, но немогу понять где. Код чуть-чуть поправил из фасмовского SWID и добавил то что мне было нужно. Компилировать как консольное приложение. Код (Text): .386 .model flat, stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc include masm32.inc include wininet.inc include oleaut32.inc includelib user32.lib includelib kernel32.lib includelib masm32.lib includelib wininet.lib includelib oleaut32.lib .data dl_id db "Microsoft Internet Explorer",0 done db ">>> [ Download complete ]",0 fail db ">>> [ Missing CMD parameter ]",0 error db ">>> [ Invalid CMD line parameters ]",0 nosession db ">>> [ Unable to create new remote session! ]",0 nourl db ">>> [ There are no connection with remote host! ]",0Dh,">>> [ Please check is connection alive? ]",0 noopenfile db ">>> [ Unable to create\open local file! ]",0Dh,">>> [ Please check your settings! ]",0 noremotefile db ">>> [ Error while reading remote file! ]",0 hFile dd 0 hInt dd 0 hUrl dd 0 dwRWfile dd 0 dwRWurl dd 0 .data? url dd 1024 dup(?) save dd 256 dup(?) savebuf dd 1024 dup (?) buff dd 1024*8 dup (?) .code start: invoke GetCL,1,addr url .if eax == 1 invoke GetCL,2,addr save .if eax == 1 invoke InternetOpen,addr dl_id,INTERNET_OPEN_TYPE_DIRECT,0,0,0 test eax,eax jnz @F invoke StdOut,addr nosession jmp @exit @@: mov hInt,eax invoke InternetOpenUrl,eax,addr url,0,0,0,0 test eax,eax jnz @F invoke StdOut,addr nourl jmp _close_inet @@: mov hUrl,eax invoke CreateFile,addr save,GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL test eax,eax jns @F invoke StdOut,addr noopenfile jmp _close_inet @@: mov hFile,eax _read_remote_file: invoke InternetReadFile,hUrl,offset buff,8192,dwRWurl ; ОШИБКА ГДЕ-ТО ЗДЕСЬ .if eax == TRUE jnz @F .else invoke StdOut,addr noremotefile jmp _error_read_remote_file .endif @@: cmp dwRWurl,0 je @F invoke WriteFile,hFile,addr buff,dwRWurl,dwRWfile,0 jmp _read_remote_file @@: invoke StdOut,addr done _error_read_remote_file: invoke CloseHandle,hFile _close_inet: invoke InternetCloseHandle,hInt .endif .else invoke StdOut,addr error jmp @exit .endif @exit: invoke ExitProcess,0 end start
SiruS Последний параметр InternetReadFile - _адрес_ переменной в которую будет помещено количество принятых байтов. + Аналогично InternetOpen парой к InternetOpenUrl нужен InternetCloseHandle.
q_q Я знаю что последний параметр это кол-во принятых байт, но почему-то он постоянно равен 0. С InternetCloseHandle это я протупил, спасибо. Что ты хотел сказать говоря что ? Мож что-то исправить в коде надо, ткни меня носом
Или может лучше помогите написать callback процедуру к URLDownloadToFile, так чтобы я видел количество переданных байт.
SiruS знаю что последний параметр это кол-во принятых байт Не правильно знаешь, да к тому же не внимательно читаешь. Не количество, а _адрес_ переменной в которой будет возвращено количество. почему-то он постоянно равен 0 Потому что ты его разместил в сегменте инициализированных данных, инициализировал нулем, передал этот ноль в InternetReadFile, которая проверив, что переданный адрес равен нулю не пытается ничего записать по нему. может лучше помогите написать callback процедуру к URLDownloadToFile В чем собственно проблема? Покажи свой код.
q_q Код (Text): .386 .model flat, stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc include masm32.inc include comdlg32.inc include urlmon.inc includelib user32.lib includelib kernel32.lib includelib masm32.lib includelib comdlg32.lib includelib urlmon.lib .data done db ">>> [ Download done! ]",0 fail db ">>> [ Download failed! ]",0 error db ">>> [ Invalid CMD line parameters ]",0 .data? url dd 1024 dup(?) save dd 256 dup(?) .code start: invoke GetCL,1,addr url .if eax == 1 invoke GetCL,2,addr save .if eax == 1 invoke URLDownloadToFile,0,addr url,addr save,0,0 ; вот сюда вместо 0 надо дописать процедуру обратной связи .if eax == 0 invoke StdOut,addr done jmp @exit .else invoke StdOut,addr fail jmp @exit .endif .else invoke StdOut,addr error jmp @exit .endif .else invoke StdOut,addr error jmp @exit .endif @exit: invoke ExitProcess,0 end start Можешь помочь? Я поправил предыдущий код, но он все равно выдает ошибку в том же месте.
slow Спасибо, с секцией данных я давно разобрался. А вот с указателем на dwRWurl я очень глупо попался Еще раз спасибо всем, кто принял участие в исправлении меня неисправимого (с) и тугого как сибирский валенок