文件关联和文件预览处理程序之间的注册表冲突

Registry conflict between file association and file preview handler

我已按照说明将自定义文件类型与我的应用程序相关联,以便双击该文件打开包含该文件的应用程序。我还按照说明为相同文件类型的预览处理程序创建注册表设置。两者都可以单独使用,但不能同时使用。当包含文件关联打开命令时,预览处理程序不起作用。以下是文件关联的注册表设置,由我的 Inno 安装程序在 instructions here.

之后创建
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xyz\OpenWithProgids (Default)=""
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xyz\OpenWithProgids XYZFile.xyz=""
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZFile.xyz (Default)="XYZ File Type"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZFile.xyz\DefaultIcon (Default)="C:\Program Files (x86)\My App\MyApp.exe,1"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZFile.xyz\shell\open\command (Default)=""C:\Program Files (x86)\My App\MyApp.exe" "%1""
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\MyApp.exe\SupportedTypes (Default)=""
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\MyApp.exe\SupportedTypes .xyz=""

这里是预览处理程序(64 位机器)的注册表设置。这些是在安装程序注册时由预览处理程序 dll 本身创建的。

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xyz (Default)="XYZPreview.xyzfile"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZPreview.xyzfile (Default)="XYZ File Preview Handler"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZPreview.xyzfile\Clsid (Default)="{64644512-C345-469F-B5FB-EB351E20129D}"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZPreview.xyzfile\shellex\{8895B1C6-B41F-4C1C-A562-0D564250836F} (Default)="{64644512-C345-469F-B5FB-EB351E20129D}"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D} (Default)="XYZ File Preview Handler"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D} AppId="{534A1E02-D58F-44f0-B58B-36CBED287C7C}"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D} DisableLowILProcessIsolation=1
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ (Default)="C:\Program Files (x86)\My App\XYZPreview.dll"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ ProgID="XYZPreview.xyzfile"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ ThreadingModel="Apartment"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ VersionIndependentProgID="XYZPreview.xyzfile"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\ProgID (Default)="XYZPreview.xyzfile"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers {64644512-C345-469F-B5FB-EB351E20129D}="XYZ File Preview Handler"

使用这些设置,当我从资源管理器打开文件时,文件会在应用程序中打开,但无法在资源管理器中预览(无法预览)。但是,如果我将 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZFile.xyz\shell\open\command(默认)清除为空字符串,则预览处理程序会起作用,但当然文件不会在应用程序中打开。知道为什么会发生这种冲突以及我如何才能让两者都起作用吗?

我找到了如下解决方案。我没有将 .xyz 扩展名 link 扩展到预览处理程序的 ProgID (XYZPreview.xyzfile),而是直接从扩展名 link 到 CLSID 并完全删除 XYZPreview.xyzfile。也许有两个扩展程序 ID 导致了冲突 (XYZFile.xyz & XYZPreview.xyzfile)。预览处理程序条目修改如下,文件关联和预览处理程序现在都可以使用。

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xyz (Default)=""
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.xyz\shellex\{8895B1C6-B41F-4C1C-A562-0D564250836F} (Default)="{64644512-C345-469F-B5FB-EB351E20129D}"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D} (Default)="XYZ File Preview Handler"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D} AppId="{534A1E02-D58F-44f0-B58B-36CBED287C7C}"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D} DisableLowILProcessIsolation=1
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ (Default)="C:\Program Files (x86)\My App\XYZPreview.dll"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ ProgID="XYZPreview.xyzfile"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ ThreadingModel="Apartment"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\InprocServer32\ VersionIndependentProgID="XYZPreview.xyzfile"
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{64644512-C345-469F-B5FB-EB351E20129D}\ProgID (Default)="XYZPreview.xyzfile"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers {64644512-C345-469F-B5FB-EB351E20129D}="XYZ File Preview Handler"