【发布时间】: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