有人可以指向一個winhttp/wininet的C++包裝,這將不需要mfc/atl?以便我可以在MSVC Express中使用它。C++ winhttp/wininet包裝發佈表單和上傳文件沒有mfc/atl
我希望能夠通過HTML格式使用GET,POST和上傳文件。
我檢查了codeproject.com中的幾個,但無法找到合適的包裝。
有什麼可以幫助我嗎?
有人可以指向一個winhttp/wininet的C++包裝,這將不需要mfc/atl?以便我可以在MSVC Express中使用它。C++ winhttp/wininet包裝發佈表單和上傳文件沒有mfc/atl
我希望能夠通過HTML格式使用GET,POST和上傳文件。
我檢查了codeproject.com中的幾個,但無法找到合適的包裝。
有什麼可以幫助我嗎?
在這裏,我給你一個讓你開始。如果您使用的是MSVC,您應該學習如何通過dll找到並找到導出的函數。 DLL Export Viewer is what I used for this.你需要找到wininet.dll在你的機器上的位置,並相應地修改代碼。我希望這有幫助。所以這裏是我的WinInetRTW類(運行時包裝器)。
// wininetrtw.h
#ifndef WININETRTW_H
#define WININETRTW_H
#include <iostream>
#include <string>
#include <sstream>
#include <windows.h>
#include <wininet.h>
typedef HINTERNET (__cdecl *HttpOpenRequestFuncPtr)(HINTERNET, LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR, LPCTSTR, DWORD, DWORD);
typedef HINTERNET (__cdecl *InternetConnectFuncPtr)(HINTERNET, LPCTSTR, INTERNET_PORT, LPCTSTR, LPCTSTR, DWORD, DWORD, DWORD_PTR);
typedef HINTERNET (__cdecl *InternetOpenFuncPtr)(LPCTSTR, DWORD, LPCTSTR, LPCTSTR, DWORD);
typedef HINTERNET (__cdecl *InternetOpenUrlFuncPtr)(HINTERNET, LPCTSTR, LPCTSTR, DWORD, DWORD, DWORD_PTR);
typedef BOOL (__cdecl *InternetReadFileFuncPtr)(HINTERNET, LPVOID, DWORD, LPDWORD);
class WinInetRTW {
public:
WinInetRTW();
~WinInetRTW();
// WinInet functions
bool LoadLibrary(std::string&);
bool HttpOpenRequest(HINTERNET hConnect, LPCTSTR lpszVerb, LPCTSTR lpszObjectName, LPCTSTR lpszVersion, LPCTSTR lpszReferer, LPCTSTR *lplpszAcceptTypes, DWORD dwFlags, DWORD_PTR dwContext);
bool InternetConnect(HINTERNET hInternet, LPCTSTR lpszServerName, INTERNET_PORT nServerPort, LPCTSTR lpszUsername, LPCTSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext);
bool InternetOpen(LPCTSTR lpszAgent, DWORD dwAccessType, LPCTSTR lpszProxyName, LPCTSTR lpszProxyBypass, DWORD dwFlags);
bool InternetOpenUrl(HINTERNET, LPCTSTR, LPCTSTR, DWORD, DWORD, DWORD_PTR);
bool InternetReadFile(HINTERNET, LPVOID, DWORD, LPDWORD);
// Helper methods
bool InternetReadFileToBuffer(HINTERNET);
// Results from respective methods
HINTERNET InternetOpenResult;
HINTERNET InternetConnectResult;
HINTERNET HttpOpenRequestResult;
HINTERNET InternetOpenUrlResult;
std::stringstream InternetReadFileStream;
private:
HttpOpenRequestFuncPtr HttpOpenRequestFunc;
InternetConnectFuncPtr InternetConnectFunc;
InternetOpenFuncPtr InternetOpenFunc;
InternetOpenUrlFuncPtr InternetOpenUrlFunc;
InternetReadFileFuncPtr InternetReadFileFunc;
};
#endif // WININETRTW_H
// wininetrtw.cpp
#include "wininetrtw.h"
WinInetRTW::WinInetRTW()
{
}
WinInetRTW::~WinInetRTW()
{
}
bool WinInetRTW::LoadLibrary(std::string& PathToDll)
{
HINSTANCE dllInstance;
dllInstance = ::LoadLibrary(PathToDll.c_str()); // Load library
this->HttpOpenRequestFunc = reinterpret_cast<HttpOpenRequestFuncPtr>(::GetProcAddress(dllInstance, "HttpOpenRequest")); // Load function
this->InternetConnectFunc = reinterpret_cast<InternetConnectFuncPtr>(::GetProcAddress(dllInstance, "InternetConnectA"));
this->InternetOpenFunc = reinterpret_cast<InternetOpenFuncPtr>(::GetProcAddress(dllInstance, "InternetOpenA"));
this->InternetOpenUrlFunc = reinterpret_cast<InternetOpenUrlFuncPtr>(::GetProcAddress(dllInstance, "InternetOpenUrlA"));
this->InternetReadFileFunc = reinterpret_cast<InternetReadFileFuncPtr>(::GetProcAddress(dllInstance, "InternetReadFile"));
if(!dllInstance){
return false;
}
return true;
}
/*
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa384363(v=vs.85).aspx
* */
bool WinInetRTW::InternetConnect(HINTERNET hInternet, LPCTSTR lpszServerName, INTERNET_PORT nServerPort, LPCTSTR lpszUsername, LPCTSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext)
{
InternetConnectResult = InternetConnectFunc(hInternet, lpszServerName, nServerPort, lpszUsername, lpszPassword, dwService, dwFlags, dwContext);
if(!InternetConnectResult){
return false;
}
return true;
}
/*
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx
* */
bool WinInetRTW::InternetOpen(LPCTSTR lpszAgent, DWORD dwAccessType, LPCTSTR lpszProxyName, LPCTSTR lpszProxyBypass, DWORD dwFlags)
{
this->InternetOpenResult = this->InternetOpenFunc(lpszAgent, dwAccessType, lpszProxyName, lpszProxyBypass, dwFlags);
if(!this->InternetOpenResult){
return false;
}
return true;
}
/*
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa385098(v=vs.85).aspx
* */
bool WinInetRTW::InternetOpenUrl(HINTERNET hInternet, LPCTSTR lpszUrl, LPCTSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext)
{
InternetOpenUrlResult = InternetOpenUrlFunc(hInternet, lpszUrl, lpszHeaders, dwHeadersLength, dwFlags, dwContext);
if(!InternetOpenUrlResult){
return false;
}
return true;
}
/*
* http://msdn.microsoft.com/en-us/library/windows/desktop/aa385103(v=vs.85).aspx
* */
bool WinInetRTW::InternetReadFile(HINTERNET hFile, LPVOID lpBufferOut, DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesReadOut)
{
return InternetReadFileFunc(hFile, lpBufferOut, dwNumberOfBytesToRead, lpdwNumberOfBytesReadOut);
}
bool WinInetRTW::InternetReadFileToBuffer(HINTERNET hFile)
{
DWORD dwRead;
char Buffer[1024];
while (this->InternetReadFile(hFile, Buffer, 1023, &dwRead))
{
if (dwRead == 0)
break;
Buffer[dwRead] = 0;
InternetReadFileStream << Buffer;
}
return true;
}
// main.cpp
#include "wininetrtw.h"
using namespace std;
int main(int argc, char **argv)
{
// Find the path to the file on your own system.
string PathToDll = "C:\\Windows\\winsxs\\x86_microsoft-windows-i..tocolimplementation_31bf3856ad364e35_9.4.8112.16441_none_1a52f663bc299b3d\\wininet.dll";
WinInetRTW net;
if(net.LoadLibrary(PathToDll)){
cout << "Library loaded!\n";
net.InternetOpen("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(net.InternetOpenUrl(net.InternetOpenResult, "http://www.google.com", NULL, 0, 0, 0))
{
net.InternetReadFileToBuffer(net.InternetOpenUrlResult);
cout << net.InternetReadFileStream.str();
}
}
else{
cout << "Library failed to load.";
}
cin.get();
return 0;
}
此外,當您在Windows庫中看到類似「InternetOpen」的功能時,通常會有兩個版本。 ANSI版本和UNICODE版本。在DLL中,它們分別通過追加'A'或'W'來區分。在我發佈的代碼中,我使用了ANSI版本,但通過將'A'更改爲'W',您可以使用函數的unicode版本。 – WithMetta
謝謝,我會盡力在此工作 – user1412386
您可以在運行時通過加載Wininet.dll來解決MSVC express的侷限性。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/ windows/desktop/ms686944(v = vs.85).aspx – WithMetta
如果您需要更多幫助或希望就您正在開發的項目進行協作,可以通過我的gmail帳戶CodingWithMetta與我聯繫。 – WithMetta