Добрый день. Нужно загнать по ftp файл на сервер. Тонкостей работы в сети не знаю, кто силён в этом, подсобите. Значит установлен сервер на локальной машине. На нём сайт www.site.ru Хочу в корень сайта (рядом с index.html) положить файл C:\file.txt. Вроде это делает ф-ция FtpPutFile, но ей нужен хэндл от InternetConnect, которой в свою очередь нужен хэндл от InternetOpen. Код (Text): .data szAgent db "myAgent",0 szHost db "ftp.site.ru" .code invoke InternetOpen, addr szAgent, INTERNET_OPEN_TYPE_DIRECT, 0, 0, INTERNET_FLAG_ASYNC .if (eax) mov hInet,eax invoke InternetConnect, hInet, addr szHost, INTERNET_DEFAULT_FTP_PORT, NULL, NULL, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, addr read .if (eax) PrintText "connect" .else mov dwErrorSize, 256 invoke InternetGetLastResponseInfo, addr dwError, addr szError, addr dwErrorSize PrintString szError .endif invoke InternetCloseHandle,hInet .endif InternetConnect возвращает ноль. Вызываю InternetGetLastResponseInfo - никакой ошибки не выдает.
а вы вызовите GetLastError и увидите ошибку . Попробуй так Код (Text): invoke InternetOpen, addr szAgent, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 .if (eax) mov hInet,eax invoke InternetConnect, hInet, addr szHost, INTERNET_DEFAULT_FTP_PORT, NULL, NULL, INTERNET_SERVICE_FTP, 0,0 .if (eax) invoke MessageBox,0, addr msg_conn,0,MB_OK .else invoke GetLastError invoke MessageBox,0, addr msg_err,0,MB_OK .endif invoke InternetCloseHandle,hInet .endif
cresta http://rsdn.ru/article/inet/wininet.xml http://rsdn.ru/article/inet/inetapi.xml http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/internetopen.asp http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/ftp_sessions.asp мне в свое время очень помогло и конечно же msdn! там есть все. вот еще метод из моего класса, может тожы поможет (рабочий 100%) Код (Text): BOOL InetDownloader::DownloadFile(LPSTR lpUrl, LPSTR lpLocalPath) { HINTERNET hInternet,hUrl; HANDLE hOutputFile; BOOL bDownload; CHAR szBuff[80]; CHAR cBuffer[16384]; DWORD dwBytesRead; ZeroMemory(szBuff,80); DWORD dw; DWORD dwFormatFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM ; LPSTR messbuff; unsigned char * aFile = NULL; DWORD num = 50000; DWORD dwSize = NULL; DWORD dwWrittenBytes = NULL; hInternet = InternetOpen("X",INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,NULL,NULL,NULL); hInternet ? printf("InternetOpen() OK\n") : printf("InternetOpen() error\n"); hUrl = InternetOpenUrl(hInternet,lpUrl,NULL,NULL,NULL,NULL); if(hUrl) { hOutputFile = CreateFile(lpLocalPath,GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hOutputFile == INVALID_HANDLE_VALUE) printf("CreateFile() error\n"); printf("InternetOpenUrl() OK\n"); do { bDownload = InternetReadFile(hUrl, cBuffer,(DWORD)16384,&dwBytesRead); bDownload ? printf("%d\n",dwBytesRead) : printf("InternetReadFile() error\n"); dwSize+=dwBytesRead; if(dwBytesRead) if(!WriteFile(hOutputFile,&cBuffer,(DWORD)dwBytesRead,&dwWrittenBytes,NULL)) printf("WriteFile() error!\n"); } while(dwBytesRead); InternetCloseHandle(hUrl); InternetCloseHandle(hInternet); } else printf("InternetOpenUrl() error\n"); dw = GetLastError(); FormatMessage(dwFormatFlags,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPSTR)&messbuff,0,NULL); CharToOem(messbuff,messbuff); printf("Error: %s\n", messbuff); return TRUE; } правда коряво написан... ну, сойдет для наглядности
TermoSINteZ InternetConnect не устанавливает lasterror. Для wininet есть специально InternetGetLastResponseInfo, которая возвращает строку с описанием ошибки. У меня возвращается пустая строка. А вызов GetLastError после InternetGetLastResponseInfo выдаёт код 317: The system cannot find message text for message number 0x%1 in the message file for %2. Как я понял, система не нашла строки с описанием для ошибки, вызваной функцией InternetConnect. YoungBastard Это не совсем то, мне нужно не скачать, а наоборот закачать на сервер файл. InternetReadFile не поможет. Самое интересное: тот код, который я привел, переделал на vb6 - и он работает Написать на vb что-ли...
cresta я привел функцию где использовал InternetOpen. Собсна, попробуй на асме заюзать таким образом InternetOpen, думаю все получиЦа, т.е. через INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY. Самое интересное: тот код, который я привел, переделал на vb6 - и он работает Написать на vb что-ли... значит у тебя где-то на асме ошибка, вот и все... =) имхо, все должно работать
cresta Чтоб узнать описание последней ошибки по коду надо вызвать FormatMessage с флагом ..._FROM_MODULE и хэндлом модуля wininet.dll
из статьи рема про трояны Код (Text): hInternet := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); hConnect := InternetConnect(hInternet, 'ftp.narod.ru', 21, 'Ms-Rem', '*****', INTERNET_SERVICE_FTP, 0, 0); if hConnect <> nil then begin FtpPutFile(hConnect, 'c:\readme.txt', 'NewText.txt', FTP_TRANSFER_TYPE_BINARY, 0); InternetCloseHandle(hConnect); end; InternetCloseHandle(hInternet);