查找 Skype 的默认帐户名称






4.79/5 (17投票s)
本文档解释了Skype帐户详细信息是如何存储的,如何获取这些信息,以及如何使用Rapid XML库解析XML文件。
引言
本文档的目的是向您展示如何查找Skype的默认帐户名。
问题
我需要编写一个函数来提取给定计算机上默认Skype帐户的数据。为此,我首先需要找到默认帐户名。我找到了一种简单的方法来做到这一点。
解决方案
Skype默认帐户名存储在一个名为“shared.xml”的文件中。该文件存储在C:\users\用户名\AppData\Roaming\Skype\。
首先,我们需要找到这个位置,因为我们需要访问的精确路径会根据用户名而变化。
为此,我们使用
SHGetSpecialFolderPath
并将其参数设置为CSIDL_APPDATA 。
根据MSDB的说法,“文件系统目录,作为应用程序特定数据的公共存储库。”
因此,要获取该路径,我们调用
TCHAR szFileName[MAX_PATH + 1];
SHGetSpecialFolderPath(0, szFileName, CSIDL_APPDATA, 0);
这个文件显然是一个XML文件
。所以下一步是打开位于该路径中的“shared.xml”,并从中提取所需的信息。
为此,我们需要一个XML解析器,我推荐RapidXML 。RapidXml是一个非常快速、开源的XML解析器,它保留了可用性,具有可移植性,并且W3C兼容。它是一个用现代C++编写的就地解析器,其解析速度接近于在相同数据上执行的strlen
函数。
或者,可以使用CString类型处理XML文件,只需调用Find来定位每个XML元素的开始和结束位置。在我的文章The Secrets of Wi-Fi Credentials中,我使用了这种方法,因此源代码中没有包含XML“辅助”类,但所有Wi-Fi凭据(在运行程序时)都会被提取,因为这些值是使用“Find()”方法找到的。
为了找到默认帐户名,我们首先需要在该文件中找到“Account
”元素,并在其内部找到“default
”元素,帐户名将在其中找到。
rapidxml::xml_node<char>* node_account = 0;
if (GetNodeByElementName(root, "Account", &node_account) == true)
{
rapidxml::xml_node<char>* node_default = 0;
if (GetNodeByElementName(node_account, "default", &node_default) == true)
{
swprintf(result, 100, L"%hs", node_default->value());
free(xmlData);
return true;
}
}
因此,如果您在编译与本文相关的源代码后运行测试应用程序,您应该得到类似于以下内容的输出
关注点
我借此机会演示了一个从头开始创建的最小MFC应用程序,未使用Visual Studio向导,仅包含必要的定义和包含文件。
与此提示相关的源代码是在Visual Studio 2013 Ultimate下创建和编译的。
自从这篇文章发布以来,我被要求添加有关获取存储的Skype聊天记录和其他存储信息的进一步说明,我计划在未来的文章中这样做。