DLL需要使用的网络封装
WinHttp异步实现GET, POST, 多线程下载文件_webclient post下载文件-CSDN博客文章浏览阅读726次。基于WinHttp封装, 实现异步多线程文件下载, GET请求, POST请求_webclient post下载文件https://blog.csdn.net/Flame_Cyclone/article/details/142644088
lua_network.h
#pragma once#include "../common/include/lua.hpp"
#include "lua_utils.h"
#include "Win32Utils/fcjson.h"class lua_network
{
public:static void register_functions(lua_State* L, const char* lib_name);static int get(lua_State* L);static int post(lua_State* L);static int download(lua_State* L);
};
lua_network.cpp
#include "lua_network.h"
#include "lua_utils.h"
#include "Win32Utils/CStrUtils.h"
#include "Win32Utils/CWinHttpClient.h"static luaL_Reg lib_functions[] =
{{"get", lua_network::get},{"post", lua_network::post},{"download", lua_network::download},{ NULL, NULL}
};void lua_network::register_functions(lua_State* L, const char* lib_name)
{lua_newtable(L);luaL_Reg* fun_info = lib_functions;while (fun_info->func){lua_pushcfunction(L, fun_info->func);lua_setfield(L, -2, fun_info->name);fun_info++;}lua_setfield(L, -2, lib_name);
}int lua_network::get(lua_State* L)
{int nTop = lua_gettop(L);_tstring strUrl;std::string strParam;_tstring strHeader;bool fCallback = false;int ref = 0;if (lua_isfunction(L, -1)){fCallback = true;ref = luaL_ref(L, LUA_REGISTRYINDEX);}if (nTop >= 1 && lua_isstring(L, 1)){strUrl = CStrUtils::AStrToTStr(lua_tostring(L, 1));}if (nTop >= 2){if (lua_isstring(L, 2)){strParam = lua_tostring(L, 2);}else if (lua_istable(L, 2)){lua_utils::dump_value(L, strParam, 2, dump_type::dump_get);}}if (nTop >= 3){if (lua_isstring(L, 3)){strHeader = lua_tostring(L, 3);}else if (lua_istable(L, 3)){lua_utils::dump_value(L, strHeader, 3, dump_type::dump_header);}}CWinHttpClient obj;CWinHttpResult res = obj.Get(strUrl, strParam, strHeader, [&L, ref, fCallback](const WINHTTP_PROGRESS_INFO& progress) -> bool {if (fCallback){lua_rawgeti(L, LUA_REGISTRYINDEX, ref);lua_newtable(L);lua_utils::set_key_value(L, "Progress", progress.lfProgress);lua_utils::set_key_value(L, "RemainTime", progress.lfRemainTime);lua_utils::set_key_value(L, "Speed", progress.lfSpeed);lua_utils::set_key_value(L, "Cur", (double)progress.ullCur);lua_utils::set_key_value(L, "Total", (double)progress.ullTotal);lua_pcall(L, 1, 0, 0);}return true;});if (fCallback){luaL_unref(L, LUA_REGISTRYINDEX, ref);}lua_newtable(L);lua_utils::set_key_value(L, "code", (lua_Integer)res.code);lua_utils::set_key_value(L, "result", CStrUtils::U8StrToAStr(res.result).c_str());return 1;
}int lua_network::post(lua_State* L)
{int nTop = lua_gettop(L);_tstring strUrl;std::string strParam;_tstring strHeader;bool fCallback = false;int ref = 0;if (lua_isfunction(L, -1)){fCallback = true;ref = luaL_ref(L, LUA_REGISTRYINDEX);}if (nTop >= 1 && lua_isstring(L, 1)){strUrl = CStrUtils::AStrToTStr(lua_tostring(L, 1));}if (nTop >= 2){if (lua_isstring(L, 2)){strParam = lua_tostring(L, 2);}else if (lua_istable(L, 2)){lua_utils::dump_value(L, strParam, 2, dump_type::dump_json);}}if (nTop >= 3){if (lua_isstring(L, 3)){strHeader = lua_tostring(L, 3);}else if (lua_istable(L, 3)){lua_utils::dump_value(L, strHeader, 3, dump_type::dump_header);}}CWinHttpClient obj;CWinHttpResult res = obj.Post(strUrl, strParam, strHeader, [&L, ref, fCallback](const WINHTTP_PROGRESS_INFO& progress) -> bool {if (fCallback){lua_rawgeti(L, LUA_REGISTRYINDEX, ref);lua_newtable(L);lua_utils::set_key_value(L, "Progress", progress.lfProgress);lua_utils::set_key_value(L, "RemainTime", progress.lfRemainTime);lua_utils::set_key_value(L, "Speed", progress.lfSpeed);lua_utils::set_key_value(L, "Cur", (double)progress.ullCur);lua_utils::set_key_value(L, "Total", (double)progress.ullTotal);lua_pcall(L, 1, 0, 0);}return true;});if (fCallback){luaL_unref(L, LUA_REGISTRYINDEX, ref);}lua_newtable(L);lua_utils::set_key_value(L, "code", (lua_Integer)res.code);lua_utils::set_key_value(L, "result", CStrUtils::U8StrToAStr(res.result).c_str());return 1;
}int lua_network::download(lua_State* L)
{int nTop = lua_gettop(L);_tstring strUrl;_tstring strHeader;_tstring strPath;bool fCallback = false;int ref = 0;if (lua_isfunction(L, -1)){fCallback = true;ref = luaL_ref(L, LUA_REGISTRYINDEX);}if (nTop >= 1 && lua_isstring(L, 1)){strUrl = CStrUtils::AStrToTStr(lua_tostring(L, 1));}if (nTop >= 2 && lua_isstring(L, 2)){strPath = CStrUtils::AStrToTStr(lua_tostring(L, 2));}if (nTop >= 3){if (lua_isstring(L, 3)){strHeader = lua_tostring(L, 3);}else if (lua_istable(L, 3)){lua_utils::dump_value(L, strHeader, 3, dump_type::dump_header);}}CWinHttpClient obj;CWinHttpResult res = obj.DownloadFile(strUrl, strPath, strHeader, [&L, ref, fCallback](const WINHTTP_PROGRESS_INFO& progress) -> bool {if (fCallback){lua_rawgeti(L, LUA_REGISTRYINDEX, ref);lua_newtable(L);lua_utils::set_key_value(L, "Progress", progress.lfProgress);lua_utils::set_key_value(L, "RemainTime", progress.lfRemainTime);lua_utils::set_key_value(L, "Speed", progress.lfSpeed);lua_utils::set_key_value(L, "Cur", (double)progress.ullCur);lua_utils::set_key_value(L, "Total", (double)progress.ullTotal);lua_pcall(L, 1, 0, 0);}return true;}, std::thread::hardware_concurrency());if (fCallback){luaL_unref(L, LUA_REGISTRYINDEX, ref);}lua_newtable(L);lua_utils::set_key_value(L, "code", (lua_Integer)res.code);lua_utils::set_key_value(L, "result", CStrUtils::U8StrToAStr(res.result).c_str());return 1;
}
lua_demo.lua
json = require("JSON")
fclib = require("FCLIB")
lib = nil
--判断当前运行位数
function is64bit()arc = os.getenv("PROCESSOR_ARCHITECTURE")if arc == "x86" thenreturn falseendreturn true
end--加载动态库
if is64bit() thenlib = require("lua_library_x64")
elselib = require("lua_library_x86")
endlib.debug.print(lib)-- 获取弹幕信息
function get_last_msg()--请求链接url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory?roomid=4412054'-- 参数local param = {}--请求头local header = {['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'}res = lib.network.get(url, param, header)lib.debug.print(res)json_val = lib.json.decode(res.result)cur_msg = nilif json_val thenfor k, v in pairs(json_val['data']['room']) doif 0 ~= k thencur_msg = vendendendreturn cur_msg
endlib.debug.print(get_last_msg())function download(info)unit = 1024 * 1024fmt = '%.2f%% %.3gMB/%.3gMB %.3gMB/s'info = string.format(fmt, info['Progress'] * 100, info['Cur'] / unit, info['Total'] / unit, info['Speed'] / unit)print(info)
end--下载链接
download_url = "https://drivers.amd.com/drivers/whql-amd-software-adrenalin-edition-24.8.1-win10-win11-aug-rdna.exe"file_path = 'whql-amd-software-adrenalin-edition-24.8.1-win10-win11-aug-rdna.exe'--请求头
header = {['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',['Referer']= 'https://www.amd.com/'
}--下载文件
fResult = lib.network.download(download_url, file_path, header, download)
效果
lua_demo_x64.exe lua_demo.lua
仓库
https://gitee.com/flame_cyclone/lua_example