我们可以来过下类的代码看下它的类是怎么用的
为实现Http访问,微软提供了二套API:WinINet, WinHTTP。WinHTTP比WinINet更加安全和健壮,可以这么认为WinHTTP是WinINet的升级版本。这两套API包含了很多相似的函数与宏定义,这两个API都是对Socket的封装。
它封装的HTTP类分别实现了使用WinInet这种方式和WinHttp方式做HTTP访问,还有一个是用纯Socket库去做的,我们使用WinHttp这种方式去访问
这里我将用到的WinHTTP API方法做访问的流程做了一个注释,方便理解
在Init方法中使用API的WinHttpOpen方法获得一个会话句柄m_hInternet
在ConnectHttpServer方法中使用WinHttpConnect获得一个连接会话
在CreateHttpRequest方法中使用WinHttpOpenRequest建立一个http请求
不过最简单的方式还是用它自带的测试类,这样比较方便一点。
在开头有一个回调来输出下载进度,我们需要把这个进度返回给TeamServer端,然后进入主函数
TestWinHttp方法演示了使用WinHttp封装好的类访问HTTP的方式
下边有一个TestDownloadFile方法演示了怎么下载文件,这个刚好适合我们,咱们可以直接将这个测试代码拿过来用。
HttpInterface测试下一步就是用来下载咱们的.net framework安装包
右键添加项目直接添加一个新工程
将该库和导出的头文件(HttpInterface-master\IHttp\IHttp\IHttpInterface.h)复制到项目文件夹下
去官网https://dotnet.microsoft.com/download/dotnet-framework/net48获取4.8Runtime的下载地址,下载后右键复制下载链接
下面来编写自己的程序
#include "pch.h" #include <iostream> #include <string> #include "IHttpInterface.h" //包含IHttp导出头文件 #pragma commit(lib,"IHttp.lib") //引入IHttp静态库 using std::wstring; //下载文件的回调类,显示下载进度&控制下载 class CMyCallback : public IHttpCallback { public: virtual void OnDownloadCallback(void* pParam, DownloadState state, double nTotalSize, double nLoadSize) { if (nTotalSize > 0) { int nPercent = (int)(100 * (nLoadSize / nTotalSize)); printf("下载进度:%d%%\n", nPercent); } } virtual bool IsNeedStop() { //如果需要在外部终止下载,返回true return false;//继续下载 } }; bool TestDownloadFile(const wchar_t* pUrl, const wchar_t* plocalpath) { IWinHttp* pHttp; bool bRet = CreateInstance((IHttpBase**)&pHttp, TypeWinHttp); //返回一个Http类,类型为WinHttp if (!bRet) { return false; } CMyCallback cb; pHttp->SetDownloadCallback(&cb, NULL); //设置下载回调 //const wchar_t* pUrl = L"https://pm.myapp.com/invc/xfspeed/qqsoftmgr/QQSoftDownloader_v1.1_webnew_22127@.exe"; //const wchar_t* pSavePath = L"c:\\down.exe"; if (!pHttp->DownloadFile(pUrl, plocalpath)) //使用DownloadFile方法下载文件并保存到相应位置 { //下载失败 //DWORD dwCode = GetLastError(); //返回操作码 HttpInterfaceError error = pHttp->GetErrorCode(); pHttp->FreeInstance(); return false; } pHttp->FreeInstance(); return true; } int main() { wstring* purl = new wstring(L"https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/1f81f3962f75eff5d83a60abd3a3ec7b/ndp48-web.exe"); //下载地址 wstring* plocalpath = new wstring(L"H:\\demo\\ndp-48-web.exe");//下载后放到H盘demo目录 if (TestDownloadFile(purl->c_str(), plocalpath->c_str())) //调用下载类 { std::cout << "下载完成" << std::endl; } }