2012-05-23 7 views
1

Может кто-нибудь указать мне на оболочку C++ winhttp/wininet, которая не потребует mfc/atl? Чтобы я мог заставить его работать в MSVC express.C++ winhttp/wininet wrapper для отправки форм и загрузки файлов без mfc/atl

Я хотел бы иметь возможность использовать GET, POST и загружать файлы также через HTML-форму.

Я проверил несколько в codeproject.com, но не смог найти подходящую обертку.

Есть ли что-то, что могло бы мне помочь?

+0

Вы можете работать с ограничениями MSVC Express, загружая Wininet.dll во время выполнения. 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

+0

Вы можете связаться со мной через мою учетную запись Gmail CodingWithMetta, если вам нужна дополнительная помощь или вы хотите сотрудничать с проектом, над которым работаете. – WithMetta

ответ

0

Здесь я сделал вам одну, чтобы вы начали. Если вы используете MSVC, вам следует научиться копаться через dll и находить экспортированные функции. DLL Export Viewer is what I used for this. Вам нужно найти где wininet.dll находится на вашем компьютере и, следовательно, изменить его. Надеюсь, это поможет. Итак, вот мой класс WinInetRTW (Run Time Wrapper).

// 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; 
} 
+0

Также, когда вы видите функцию, подобную «InternetOpen» в библиотеке Windows, часто есть две версии. Версия ANSI и версия UNICODE. В DLL они дифференцируются путем добавления «A» или «W» соответственно. В опубликованном мной коде я использовал версию ANSI, но, изменив «A» на «W», вы можете использовать версию функции unicode. – WithMetta

+1

спасибо, я постараюсь работать над этим – user1412386