.rdp文件是纯文本INI格式,需按:i:/:s:/:b:等类型标识解析键值对,跳过#注释与空行,trim空格,区分大小写,语义枚举值需实测标注。

rdp文件本质是INI格式,用标准库解析即可
Windows的.rdp文件不是二进制协议,而是纯文本INI风格配置,每行形如screen mode id:i:2或username:s:admin。C++里无需专用SDK,直接按键值对读取就能覆盖95%场景。
常见错误是试图用XML解析器或网络协议库去处理——.rdp文件和RDP协议本身完全无关,它只是客户端启动时的参数快照。
- 注意换行符:Windows写入用
\r\n,跨平台读取时建议用std::getline并trim两端空白 - 忽略注释行:以
#开头的行必须跳过(例如# RDP file generated by Remote Desktop Connection) - 值中的冒号和等号不转义:
domain:s:contoso.com中contoso.com就是完整值,冒号仅用于分隔键与类型标识
手动解析时要区分字段类型标识(i/s/b)
.rdp文件里每个键后面紧跟:i:、:s:、:b:等类型标记,表示整数(integer)、字符串(string)、布尔(boolean)。不解析类型标识会导致数值误读,比如desktopwidth:i:1920若当字符串取,后续无法直接参与计算。
典型字段类型映射:
立即学习“C++免费学习笔记(深入)”;
-
:i:→ 转为int,用std::stoi;非法值抛异常,需捕获 -
:s:→ 原样保留,但注意可能含Unicode(UTF-16 LE编码的.rdp文件少见,但存在;默认ANSI/UTF-8更常见) -
:b:→ 只接受1或0,对应true/false,不能识别yes/on -
:d:(很少见)→ 表示双精度浮点数,用std::stod
用std::ifstream逐行解析比正则更稳
正则表达式容易被注释、空行、值中空格干扰。实际项目中,用std::ifstream配合std::string::find定位第一个:和第二个:更可靠。
示例关键逻辑片段:
std::string line;
while (std::getline(file, line)) {
if (line.empty() || line[0] == '#') continue;
size_t first_colon = line.find(':');
if (first_colon == std::string::npos) continue;
size_t second_colon = line.find(':', first_colon + 1);
if (second_colon == std::string::npos) continue;
std::string key = line.substr(0, first_colon);
std::string type_marker = line.substr(first_colon + 1, second_colon - first_colon - 1);
std::string value = line.substr(second_colon + 1);
// 后续按type_marker分发处理...
}
注意:value末尾可能有空格,std::string::erase配合find_last_not_of清理更安全。
第三方库如inih可省事,但要注意Windows路径兼容性
如果项目已用inih(ini.h单头库),它默认支持.rdp格式,但需设置INI_ALLOW_MULTILINE = 0(.rdp不允许多行值),且调用ini_parse前确保传入的是窄字符路径(const char*)。
易踩坑点:
- 在MSVC下用
std::filesystem::path构造路径后,直接.c_str()可能返回宽字符指针,需显式转UTF-8 -
inih不识别#注释(默认只认;),需预处理替换或改用ini_parse_string自行过滤 - 字段名大小写敏感:
Username和username被视为不同键,而mstsc.exe实际不区分——业务逻辑里建议统一转小写再查
真正难的不是解析语法,而是字段语义理解:比如connection type:i:7中7代表LAN,但这个枚举值未公开文档化,只能靠实测或逆向mstsc.exe。这类隐含约定,代码里得加注释说明来源。


















