1. urlmon
介绍
urlmon
是指 URL Moniker API,它是 Microsoft Windows 操作系统中的一部分,通常用于处理 URL 和相关的任务。urlmon.dll
是其动态链接库,提供了一系列函数和接口,主要用于以下目的:
- URL 分析和处理:
urlmon
提供了从 URL 中提取信息、解析和构建 URL 的功能。 - 协议处理:支持不同协议(如 HTTP、HTTPS、FTP 等)的处理,允许应用程序通过统一的接口访问各种类型的资源。
- 下载和缓存:
urlmon
支持从网络下载资源并将其缓存,以提高访问速度和减少网络流量。 - 安全管理:涉及 URL 访问的安全性管理,包括区域设置、安全验证等。
具体功能和用途
- Moniker:Moniker 是 COM(组件对象模型)的一部分,用于标识和绑定对象。URL Moniker 特别用于与网络资源相关的 Moniker。
- Internet Explorer 和其他应用程序:
urlmon
广泛用于 Internet Explorer 和其他需要执行网络操作的应用程序中,帮助它们处理网络资源。 - 下载管理:提供了下载文件的功能,包括进度跟踪、断点续传等。
- 安全区域管理:管理和执行基于 URL 的安全策略,确保访问网络资源的安全性。
示例代码
以下是一个使用 urlmon.dll
中的 URLDownloadToFile
函数下载文件的简单示例:
#include <iostream>
#include <urlmon.h>
#pragma comment(lib, "urlmon.lib")
int main() {
HRESULT hr = URLDownloadToFile(
NULL, // 不使用绑定上下文
L"https://example.com/file.txt", // 要下载的 URL
L"D:\\path\\to\\local\\file.txt", // 本地保存路径
0, // 保留参数,必须为 0
NULL // 不使用回调接口
);
if (SUCCEEDED(hr)) {
std::wcout << L"Download succeeded!" << std::endl;
} else {
std::wcout << L"Download failed with error code: " << hr << std::endl;
}
return 0;
}
主要接口和函数
以下是 urlmon.dll
中一些常用的接口和函数:
- URLDownloadToFile: 用于下载文件。
- URLOpenStream: 打开 URL 并返回包含资源的流。
- URLOpenBlockingStream: 同步地打开 URL 并返回流。
- URLOpenPullStream: 为异步数据拉取打开 URL。
总之,urlmon
是一个强大的工具集,提供了丰富的功能来处理 URL 和网络资源,广泛用于 Windows 平台上的各种应用程序中。
2. urlmon
应用案例
文本列表中存储了大量的mp4文件的url,每行是一个mp4的url地址,从该文本文件中下载mp4文件。
#include <iostream>
#include <fstream>
#include <string>
#include <urlmon.h>
#pragma comment(lib,"urlmon.lib")
using namespace std;
int main()
{
std::string txt("mp4_lists.txt"); // 待下载的视频列表
std::string dst_root("D:\\dst_Videos\\"); // 下载的视频文件保存地址
std::ifstream in_file(txt);
if (!in_file.is_open())
{
std::cout << "Open file failed.\n";
}
std::string line, dst;
constexpr int kUrlLen = 200;
wchar_t wsrc[kUrlLen];
wchar_t wdst[kUrlLen];
while (std::getline(in_file, line)) {
if (line.size() >= kUrlLen) {
std::cout << "url's length is beyond " << kUrlLen << std::endl;
return 0;
}
auto found = line.find_last_of("/");
dst = dst_root + std::string(line.begin() + found + 1, line.end());
swprintf(wsrc, kUrlLen, L"%hs", line.c_str());
swprintf(wdst, kUrlLen, L"%hs", dst.c_str());
HRESULT hr = URLDownloadToFile(0, wsrc, wdst, 0, NULL);
if (hr != S_OK)
{
std::cout << "Download error!\n";
return 0;
}
}
return 0;
}
其中mp4_lists.txt
中的内容是类似下面待下载的视频列表:
https://example.com/1.mp4
https://example.com/2.mp4
https://example.com/3.mp4