Пытаюсь подключиться к ftp.narod.ru к реальному акаунту Код (Text): HINTERNET hInternet = InternetOpen("lpszAgent", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0); if (hInternet != 0) { HINTERNET hConnect = InternetConnect(hInternet, "ftp.narod.ru", INTERNET_DEFAULT_FTP_PORT, "имя", "пароль", INTERNET_SERVICE_FTP, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_PASSIVE, 0); if (hConnect != 0) { MessageBox(0,"OK",0,MB_OK); InternetCloseHandle(hConnect); } else { MessageBox(0,"Error",0,MB_OK); } } BOOL lRes = InternetCloseHandle(hInternet); Выдаёт MessageBox(0,"Error",0,MB_OK) (в Vista). Почему? У вас работает?
vg 1) что GetLastError? 2) если попробовать так Код (Text): hConnect = InternetConnect(hInternet, "ftp://имя:пароль@narod.ru", INTERNET_DEFAULT_FTP_PORT, NULL, NULL, ...
Не могу получить код Код (Text): void GetError() { // Retrieve the system error message for the last-error code LPTSTR pszMessage; DWORD dwLastError = GetLastError(); FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pszMessage, 0, NULL ); MessageBox(0,pszMessage,0,MB_OK); LocalFree(pszMessage); } MessageBox пустой. Что-то неправильно? То же самое.
vg попробуй Код (Text): #define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <wininet.h> #include <tchar.h> #pragma comment(linker, "-entry:start -subsystem:windows") #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "user32.lib") #pragma comment(lib, "wininet.lib") static void WinInetLastError(DWORD lasterror, LPCTSTR pszFunc) { TCHAR msg[ 1024 ]; DWORD size = 512; LPTSTR buffer = GlobalAlloc(GPTR, size * sizeof(TCHAR)); if (NULL == buffer) wsprintf(msg, _T("InetLastError: GlobalAlloc failed %d"), GetLastError()); else { msg[ 0 ] = _T('\0'); if (ERROR_INTERNET_EXTENDED_ERROR == lasterror) { DWORD ecode = 0; if (0 == InternetGetLastResponseInfo(&ecode, buffer, &size)) wsprintf(msg, _T("InetLastError: InternetGetLastResponseInfo failed %d"), GetLastError()); else wsprintf(msg, _T("%s INTERNET_EXTENDED_ERROR: %d %s"), pszFunc, ecode, buffer); } else { DWORD lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); DWORD flag = FORMAT_MESSAGE_FROM_SYSTEM; if(0 == FormatMessage(flag, NULL, lasterror, lang, buffer, size, NULL)) { HMODULE hDll = GetModuleHandle(_T("wininet.dll")); if (NULL == hDll) wsprintf(msg, _T("InetLastError: GetModuleHandle failed %d"), GetLastError()); else { DWORD flag = FORMAT_MESSAGE_FROM_HMODULE; if (0 == (FormatMessage(flag, hDll, lasterror, lang, buffer, size, NULL))) wsprintf(msg, _T("InetLastError: FormatMessage failed %d"), GetLastError()); else wsprintf(msg, _T("%s failed %d %s"), pszFunc, lasterror, buffer); } } else wsprintf(msg, _T("%s failed %d %s"), pszFunc, lasterror, buffer); } MessageBox(NULL, msg, NULL, MB_OK); GlobalFree(buffer); } } static void foo(void) { LPCTSTR url = _T("ftp.narod.ru"); LPCTSTR user = _T("имя"); LPCTSTR pwd = _T("пароль"); HINTERNET hInternet = InternetOpen(_T("foo"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); if (0 == hInternet) WinInetLastError(GetLastError(), _T("InternetOpen")); else { HINTERNET hConnect = InternetConnect(hInternet, url, INTERNET_DEFAULT_FTP_PORT, user, pwd, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); if (0 == hConnect) WinInetLastError(GetLastError(), _T("InternetConnect")); else { MessageBox(NULL, _T("Everything is allright."), _T("hi"), MB_OK); InternetCloseHandle(hConnect); } InternetCloseHandle(hInternet); } } void __declspec(naked) start(void) { foo(); ExitProcess(0); }
Код (Text): LPTSTR buffer = GlobalAlloc(GPTR, size * sizeof(TCHAR)); Компилятор (MSVS 2008) ругается error C2440: 'initializing' : cannot convert from 'HGLOBAL' to 'LPTSTR' Если заменить LPTSTR на HGLOBAL Код (Text): if (0 == InternetGetLastResponseInfo(&ecode, buffer, &size)) error C2664: 'InternetGetLastResponseInfoA' : cannot convert parameter 2 from 'HGLOBAL' to 'LPSTR' Код (Text): if(0 == FormatMessage(flag, NULL, lasterror, lang, buffer, size, NULL)) error C2664: 'FormatMessageA' : cannot convert parameter 5 from 'HGLOBAL' to 'LPSTR' Код (Text): if (0 == (FormatMessage(flag, hDll, lasterror, lang, buffer, size, NULL))) error C2664: 'FormatMessageA' : cannot convert parameter 5 from 'HGLOBAL' to 'LPSTR'
У меня его и не было. Добавил. Теперь плюс к error C2440: 'initializing' : cannot convert from 'HGLOBAL' to 'LPTSTR' выдаёт warning C4005: 'STRICT' : macro redefinition c:\...\stdafx.h Т. е., как я понял, он был (где-то в подключаемых файлах).
vg Хорошо. Если у тебя уже есть STRICT, то мой, можно удалить. Замени/добавь в #4 Код (Text): ... //-- LPTSTR buffer = GlobalAlloc(GPTR, size * sizeof(TCHAR)); LPTSTR buffer = (LPTSTR) GlobalAlloc(GPTR, size * sizeof(TCHAR)); ... //-- GlobalFree(buffer); GlobalFree((HGLOBAL) buffer); ...
q_q Хм... нет. Я всегда с FTP работаю через Total Commander (работает нормально), поэтому не замечал. Что может быть? Комп к Интернету подключён через прокси (UserGate) в локалке.
vg > с FTP работаю через Total Commander (работает нормально) Возможно, total общается с ftp примерно так, как писал K10 в #7. Посмотри (например, при помощи netstat или tcpview by sysinternals) держит ли total открытое соединение, когда не передает/принимает файлы. > через прокси (UserGate) в локалке Попробуй выйти в проводнике на ftp.microsoft.com. Если получится, то попробуй, заменив в коде Код (Text): LPCTSTR url = _T("ftp.microsoft.com"); LPCTSTR user = NULL; LPCTSTR pwd = NULL; выйти туда через программу.
А что он там писал (кажется он только писал, что топик недостаточно низкоуровневый) ? Теперь там только "-". Если подключение не установлено, то Totalcmd.exe в списке нет. Если подключение установлено (без передачи файлов) - Totalcmd.exe:2648 ... ESTABLISHED С проводником я уже разобрался (в настройках прокси не был указан адрес для FTP) - всё открывается, включая ftp.microsoft.com. Моя прога по старому - InternetConnect failed 12029 A connection with the server could not be established.
vg > что он там писал Прошу прощения. Я перепутал с другим сообщением. > проводником я уже разобрался (в настройках прокси не был указан адрес для FTP) - всё открывается Т.е. ты ходишь в инет через прокси. Сейчас у меня нет возможности попробовать такую конфигурацию, поэтому только предположение. Попробуй изменить в коде Код (Text): //-- HINTERNET hInternet = InternetOpen(_T("foo"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); HINTERNET hInternet = InternetOpen(_T("foo"), INTERNET_OPEN_TYPE_PROXY, _T("ftp=ftp://<йпи или имя прокси>:<порт прокси>"), _T("пароль на прокси"), 0);