65.9K
CodeProject 正在变化。 阅读更多。
Home

查找 Skype 的默认帐户名称

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (17投票s)

2014 年 10 月 7 日

CPOL

2分钟阅读

viewsIcon

19002

downloadIcon

237

本文档解释了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聊天记录和其他存储信息的进一步说明,我计划在未来的文章中这样做。

© . All rights reserved.