c ++ winhttp / wininet包装器发布表单和上传文件没有mfc / atl [英] c++ winhttp/wininet wrapper to post forms and upload files without mfc/atl

查看:145
本文介绍了c ++ winhttp / wininet包装器发布表单和上传文件没有mfc / atl的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可能有人指向我一个winhttp / wininet基于c ++包装,这将不需要mfc / atl?所以我可以在MSVC express中使用它。



我想通过HTML形式使用GET,POST和上传文件。 p>

我已经在codeproject.com中检查过几个,但是找不到合适的包装器。



帮助我?

解决方案

在这里,我给你一个让你开始。如果你使用MSVC,你应该学会如何通过dll的挖掘和找到导出的功能。 DLL导出查看器是我用于此目的。你就需要找到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函数
bool LoadLibrary(std :: string&);
布尔HttpOpenRequest中(HINTERNET hConnect,LPCTSTR lpszVerb,LPCTSTR lpszObjectName,LPCTSTR lpszVersion,LPCTSTR lpszReferer,LPCTSTR * lplpszAcceptTypes,DWORD dwFlags中,DWORD_PTR dwContext);
布尔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);

//辅助方法
bool InternetReadFileToBuffer(HINTERNET);

//各个方法的结果
HINTERNET InternetOpenResult;
HINTERNET InternetConnectResult;
HINTERNET HttpOpenRequestResult;
HINTERNET InternetOpenUrlResult;
std :: stringstream InternetReadFileStream;

私人:
HttpOpenRequestFuncPtr HttpOpenRequestFunc;
InternetConnectFuncPtr InternetConnectFunc;
InternetOpenFuncPtr InternetOpenFunc;
InternetOpenUrlFuncPtr InternetOpenUrlFunc;
InternetReadFileFuncPtr InternetReadFileFunc;

};

#endif // WININETRTW_H

// wininetrtw.cpp

#includewininetrtw.h

WinInetRTW :: WinInetRTW()
{
}

WinInetRTW ::〜WinInetRTW()
{
}

bool WinInetRTW :: LoadLibrary(std :: string& PathToDll)
{
HINSTANCE dllInstance;
dllInstance = :: LoadLibrary(PathToDll.c_str()); //加载库

&这个 - GT; HttpOpenRequestFunc = reinterpret_cast的< HttpOpenRequestFuncPtr>(:: GetProcAddress的(dllInstanceHttpOpenRequest中)); // 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
* * /
布尔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
* * /
布尔WinInetRTW :: InternetOpen(LPCTSTR lpszAgent,DWORD dwAccessType,LPCTSTR lpszProxyName,LPCTSTR lpszProxyBypass,DWORD dwFlags中)
{
&这个 - GT; InternetOpenResult =这个 - > ; 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
* * /
布尔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
* * /
布尔WinInetRTW :: InternetReadFile的(HINTERNET HFILE,LPVOID lpBufferOut,DWORD dwNumberOfBytesToRead,LPDWORD lpdwNumberOfBytesReadOut)
{
返回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<<缓冲;
}

return true;
}


// main.cpp

#includewininetrtw.h

using namespace std;

int main(int argc,char ** argv)
{
//查找您自己系统上文件的路径。
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<< 库加载!\\\
;
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 InternetOpenUrlResult);
cout<< net.InternetReadFileStream.str();
}
}
else {
cout<< 库加载失败。
}

cin.get();
return 0;
}


could somebody point me to a winhttp/wininet based c++ wrapper which would not require mfc/atl? So that I might get it to work in MSVC express.

I'd like to be able to use GET, POST and upload files too through HTML-form.

I've checked several in codeproject.com but had trouble finding a suitable wrapper.

Is there something that could help me?

解决方案

Here I made you one to get you started. If you are using a MSVC you should learn how to dig down through dll's and find exported functions. DLL Export Viewer is what I used for this. You'll need to find where wininet.dll is located on your machine and alter the code accordingly. I hope this helps. So here is my WinInetRTW class (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;
}

这篇关于c ++ winhttp / wininet包装器发布表单和上传文件没有mfc / atl的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆