使用Boost避免用户访问C ++项目中的文本资源

时间:2013-06-03 17:48:24

标签: c++ xml eclipse boost

我正在使用Eclipse Helios,QT 4.6.1集成插件和boost 1.52库来开发C ++项目。我想从xml文件中提取一些信息,我现在正通过调用boost函数const read_xml(std::string &, Ptree &, int = 0, const std::locale & = std::locale())来提取这些信息。

关键是我希望避免最终用户从发布文件夹中访问该xml资源,我不知道该怎么做。是否有任何(简单)方法我可以从可执行文件中处理xml内容,以便将其加载到内存中并继续执行其余的过程,因为我已经在处理xml文件被视为项目资源?任何提示都不仅仅是我的赞赏。

提前致谢。

3 个答案:

答案 0 :(得分:2)

如果要阻止程序用户修改XML文件,则应使用资源编译可执行文件中的文件。

如果您已经在使用Qt,那么请务必查看qrc in Qt 4.6。 Qt提供了一种很好的系统独立方式,可以将资源文件嵌入到可执行文件中。如果您的项目尚未使用Qt,那么您可能不希望仅为此添加它。

如果您需要特定于Windows的资源文件,可以查看.rc files documentation。为了检查编译资源文件中的内容,我过去使用过ResEdit,发现它非常有用。您甚至可以使用它创建资源文件。

如果您的目标是Mac OS,您可能需要查看bundles,它们是您可以放置​​资源的目录。如果您对应用程序进行签名,则可以阻止用户修改捆绑包中的任何文件(我不确定是否需要签名,我在Mac OS开发方面没有太多经验。)

如果你的目标是Linux或类似的,你可以尝试this trick这似乎很有效。

所有这些方法的目的都只是将您的XML文件嵌入到您的可执行文件中,这样您的用户就无法轻易修改它(理论上它仍然是可能的,但Muggles将无法这样做)。读取文件可能取决于您选择的解决方案。我个人不喜欢Windows资源系统,只有在必要时才使用它,避免像瘟疫这样的Win32 API。如果您选择使用Qt,则可以非常轻松地阅读该文件,如果您愿意,可以使用boost进行操作。您可以使用"resources/config.xml"指向资源文件,而不是在":/config.xml"处读取文件。这将是资源文件:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>config.xml</file>
</qresource>
</RCC>

然后当你阅读它时,我不确定你是否必须使用Qt类来访问它,但即使你这样做,也可以使用QFile打开文件并调用{{1然后在boost:

中使用结果
readAll

我没有对它进行过测试,但它应该可以使用类似的东西。

答案 1 :(得分:1)

read_xml已超载。您可能正在参考此功能:

read_xml(filename ... )

但也有

read_xml(stream ...)

其中stream是以任何方式生成的任何std::istream对象。您甚至可以在源中将硬编码的字符串转换为流。

答案 2 :(得分:1)

再次感谢您的提示Uflex。我的应用程序的要点是使用QT,但仅用于GUI功能,避免在下面的应用程序控制器中使用...

我刚刚检查了你的方法,它主要是我正在寻找的,除了最后一行,因为read_xml函数接受带有xml文件路径的字符串或带有xml内容的字符串流。因此,在将您的解释与这两个链接结合后:

How to feed Boost.PropertyTree with a string, not a file?

http://doc.qt.digia.com/4.6/resources.html

我们准备好了......

istringstream ss;
QFile file (QString::fromStdString(pathString));
if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
    ss.str(QString(file.readAll()).toStdString());
    read_xml(ss, ...)
    ...
}