【问题标题】:Preview handler dll permissions issue预览处理程序 dll 权限问题
【发布时间】:2021-06-18 13:35:34
【问题描述】:

我正在为与我开发的应用程序关联的自定义图形文件类型创建预览处理程序 dll。由于各种原因,预览处理程序 dll 无法为预览本身呈现图形。相反,我正在尝试通过以下方式进行操作。

  • 与文件关联的我的图形应用程序已被修改为接受特定的命令行参数(文件路径、宽度、高度)。使用这些参数,应用程序加载文件、渲染图像并将其作为 .png 文件保存在用户的 AppData/Roaming 文件夹中,然后终止。如果我使用有效参数从命令行调用应用程序,这可以正常工作。 .png 按预期创建。

  • 当预览处理程序运行时,它使用命令行参数调用应用程序,用于预览文件和预览窗格的尺寸。它使用 Windows 函数 CreateProcess 执行此操作,并在继续之前等待应用程序终止。

  • 预览处理程序然后加载 .png 文件并将其绘制到预览窗格。

我遇到的问题是在第二步。预览处理程序调用应用程序,但应用程序给出无法保存 .png 文件的错误(“无法创建文件。访问被拒绝”)。与我自己从命令行运行时相比,预览处理程序执行时应用程序的运行权限似乎更少。

我尝试更改文件的保存位置,例如用户的 AppData/Local、共享的 ProgramData 文件夹和应用程序的位置,但都给出了相同的结果。我还尝试在对 CreateProcess 的调用中设置各种 CreationFlags,但它们都没有帮助。

有谁知道为什么应用程序在从预览处理程序调用时没有保存文件的权限,我可以做些什么来让它工作吗?我意识到这是实现预览处理程序的一种不寻常的方式,但它是最简单的方式,无需移植大量代码。另一个优点是我不会在主应用程序和预览处理程序中复制渲染代码,这意味着预览处理程序可以小得多。

请注意,我在 Windows 10 上运行。

【问题讨论】:

  • 如果您正在处理图形文件类型(如 .png、.jpeg 等),您可以提供 IThumbnailProvider 而不是预览处理程序。它将充当资源管理器预览窗格中的预览。
  • 是我自己设计的自定义二进制文件类型,不是标准的图形文件。
  • 是的,我明白了。如果您愿意,.png、.heic、.webp 都是自定义二进制文件类型。如果您有自己的自定义文件类型来表示图像,则不需要预览处理程序来启用预览窗格,您可以实现缩略图提供程序。例如,查看 Computer\HKEY_CLASSES_ROOT\.heic 中的注册表(如果您有 Windows 10 heic 扩展)。它声明了一个 PerceivedType=image 并有一个 ShellEx\{e357fccd-a995-4576-b01f-234630154e96} 节点(=> 缩略图提供程序)。它没有预览处理程序,但您仍然可以看到 .heic 作为预览。
  • 我明白了。但是,如果缩略图提供程序是另一个低 IL dll,那么我将遇到同样的问题。您知道默认情况下缩略图提供者是否具有比预览处理程序更高的权限?还是文件的主应用程序中内置了缩略图提供程序?

标签: winapi


【解决方案1】:

有谁知道为什么应用程序在从预览处理程序调用时没有保存文件的权限,我可以做些什么来让它工作吗?

根据文档:

Preview Handlers and Shell Preview Host

预览处理程序在选择一个项目以显示轻量级,丰富的只读预览视图的阅读窗格中时调用。这是在不启动文件的关联应用程序的情况下完成的。

...

默认情况下,出于安全原因,预览处理程序在低完整性级别 (IL) 进程中运行。您可以通过在注册表中设置以下值来选择禁用作为低 IL 进程运行。但是,不建议这样做。系统最终可以配置为拒绝任何不低 IL 的进程。

HKEY_CLASSES_ROOT
    CLSID
       {YOUR HANDLER'S CLSID}
          DisableLowILProcessIsolation

另一个优点是我没有在主应用程序和预览处理程序中复制渲染代码,这意味着预览处理程序可以小得多。

我建议将渲染代码移动到 DLL 中。导出一个以文件名/pidl/stream 和目标HDC 作为参数的函数。该函数可以根据需要从文件中读取并绘制到HDC。然后,主应用程序和预览处理程序可以共享 DLL,在需要时调用该函数以将文件直接呈现到各自的 UI。您根本不需要创建临时 .PNG 文件。

【讨论】:

  • 谢谢。但是,我无法将渲染代码放入 dll 中,原因与我无法将其放入预览处理程序 dll 中的原因相同。我的应用程序和渲染代码是使用 Delphi FMX 创建的,据我所知,它无法创建 dll。我会试试注册表项。
  • @XylemFlow FMX 可以在 DLL 中使用。唯一的问题是 GDI+ 启动,通常在住房过程中应该没问题,但有一些方法可以做到这一点,如 GDI+ 文档中所述。
  • 几天前你告诉我VCL和FMX不是设计用来混合在一起的。你有任何关于在 dll 中包含 FMX 的信息的链接吗?
  • 谢谢,我会看看那些。注册表解决方案目前正在运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 2021-11-28
  • 2021-04-27
  • 2016-01-28
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多