1

我需要在内存或磁盘上创建 FileSystem 类型的东西,可以像磁盘上的文件一样访问它,哪个路径可以在 fopen() 等函数中使用。

详细信息:我正在使用 AddFontResourceEx 函数在应用程序中加载字体。由于此功能需要文件路径,因此文件需要存在于磁盘上。但我要求用户不能访问/查看字体文件。

我尝试了 AddFontMemResourceEx 函数,但加载的字体不可枚举,因此用户无法在应用程序中看到字体。我还尝试了一些创建 VFS 的库,但它们像数据库一样工作,即您可以创建文件/目录并访问它们。但不能在 AddFontResourceEx 或任何其他函数中使用它们的文件路径。

是否有某种方法可以在内存或磁盘上创建一个可以通过我的应用程序访问的虚拟文件系统,并且我可以在创建的这个虚拟文件系统上写入/读取文件,并且 AddFontResourceEx 函数可以使用它的文件路径。

4

3 回答 3

2

它真的不能工作。是的,您可以添加“虚拟”文件系统。但它要么对用户 X 可见,要么不可见。Windows 上的访问控制基于每个用户,而不是每个程序。因此,如果用户 X 可以在应用程序 A 中看到字体,那么他也可以在应用程序 B 中看到它——即使 B 是 Explorer.EXE。

于 2012-06-07T15:26:33.430 回答
0

如果用户是管理员,如果他们有足够的决心,你就不能真正阻止他们看到字体文件。例如,他们可以对您的程序进行逆向工程,以弄清楚您是如何生成文件的,并手动重复该过程以制作自己的副本。或者(即使您可以以某种方式将文件权限绑定到您的进程)他们可以将自己的代码插入到您的进程中以检索文件,或直接从内存中检索字体信息。

如果它足以让他们很难看到字体文件,你可以试试这个:

  1. 在 temp 文件夹中创建一个目录,对当前用户具有只写权限,对其他任何人没有权限。

  2. 创建一个具有长、复杂、加密随机名称的子目录,并且对当前用户具有完全权限。(名称每次都应该不同。)

  3. 将字体文件写入子目录并加载。

  4. 删除字体文件并删除这两个目录。

整个过程只需要几分之一秒,这会使用户难以覆盖权限并检索文件。如果他们使用调试器单步执行程序,那么我猜你不走运,但正如我已经指出的那样,没有什么能阻止每个人。

据推测,另一种选择是只使用 AddFontMemResourceEx 并忍受字体不可枚举的事实。您只需要更改代码,以便在枚举字体的任何地方手动将您的字体添加到列表中。

于 2012-06-07T20:47:50.040 回答
0

如果你没有得到正确的答案,也许你没有问对正确的问题

您的帖子标题提到了“虚拟文件系统”,但是。后来,您提到“访问字体”。

“虚拟文件系统”是一个以多种方式使用的模棱两可的术语。

一种常见情况是向操作系统添加设备或网络

在您的情况下,似乎是从应用程序访问。

有几种方法(“库”)可以模拟或使用文件系统。

其中一些独立于真实文件系统工作。您与他们一起工作,将数据保存在那些“虚拟”文件夹和文件中,并从真实和虚拟的文件夹和文件中复制数据。

其中一些作为扩展层在真实文件系统和编程文件系统之间工作。

示例:我使用的应用程序需要临时快速的 IO 访问。找到了一个库,当您想在真实文件系统中创建文件夹或保存文件时,它就完成了。

此外,我可以添加存储在内存中的“虚拟驱动器”,但可以通过文件系统操作访问。应用程序完成后,“硬盘驱动器”及其数据将从内存中删除。

看来您的情况与我的示例相似。

你想要一个“虚拟文件系统”库来做什么?

我在网上看到了几个库,用于 C++、开源、免费软件和商业。

这取决于你想做什么,找出哪个库更适合你的情况。

祝你好运

于 2012-06-07T15:39:15.597 回答