为 Win10 和 Win11 注册属性表外壳扩展不适用于 .arw 文件

为 Win10 和 Win11 注册属性表外壳扩展不适用于 .arw 文件

我编写了一个属性表外壳扩展来显示文件中的元数据。它完美适用于诸如 之类的新文件类型.foobar。但是当注册现有的 时.arw,属性表外壳扩展会被忽略。

这看起来与这个非常古老的问题相同:https://stackoverflow.com/questions/34011698/property-sheet-handlers-on-windows-10不幸的是,这个问题没有好的答案。

注册使用的代码如下:

const FileExt = '.foobar'; // '.arw' FileClass = 'FoobarFile'; // 'ArwFile' FileType = 'foobar 文件'; // 'arw 文件'

procedure TMyDelphiPropSheetHandlerFactory.UpdateRegistry(ARegister: Boolean);
var
    Reg         : TRegistry;
    ClassID     : String;
    Res         : UInt;
    SubKey      : String;
begin
    ClassID     := GUIDToString(Class_MyDelphiPropSheetHandler);
    Reg         := TRegistry.Create;
    try
        if ARegister then begin
            inherited UpdateRegistry(ARegister);  // This registers the COM object as usual

            Reg.RootKey := HKEY_CLASSES_ROOT;
            SubKey := FileExt;
            if not Reg.OpenKey(SubKey, TRUE) then begin
                MyMessageBox('Unable to open key "HKCR\%s"', [SubKey]);
                Exit;
            end;
            Reg.WriteString('', FileClass);
            Reg.CloseKey;

            SubKey := FileClass + '\shellex\PropertySheetHandlers\' + ProgName;
            if not Reg.OpenKey(SubKey, TRUE) then begin
                MyMessageBox('Unable to open key "HKCR\%s"', [SubKey]);
                Exit;
            end;
            Reg.WriteString('', ClassID);
            Reg.CloseKey;

            Reg.RootKey := HKEY_LOCAL_MACHINE;
            SubKey := '\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved';
            if not Reg.OpenKey(SubKey, FALSE) then begin
                MyMessageBox('Unable to open key "HKLM\%s"', [SubKey]);
                Exit;
            end;
            Reg.WriteString(ClassID, FileType);
        end
        else begin
            // Unregister
            Reg.RootKey := HKEY_LOCAL_MACHINE;
            SubKey := '\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved';
            if Reg.OpenKey(SubKey, FALSE) then begin
                Reg.DeleteValue(ClassID);
                Reg.CloseKey;
            end;

            Reg.RootKey := HKEY_CLASSES_ROOT;
            SubKey := FileClass + '\shellex\PropertySheetHandlers';
            if Reg.OpenKey(SubKey, TRUE) then begin
                Reg.DeleteKey(ProgName);
                Reg.CloseKey;
            end;

            SubKey := FileExt;
            if Reg.OpenKey(SubKey, FALSE) then begin
                Reg.DeleteValue('');
                Reg.CloseKey;
            end;
            
            inherited UpdateRegistry(ARegister);  // This unregister the COM object as usual
        end;
    finally
        Reg.CloseKey;
        Reg.Free;
    end;
end;

.arw 第 1/3 部分.arw 第 2/3 部分.arw 第 3/3 部分ArwFile 第 1/2 部分ArwFile 第 2/2 部分

答案1

回答我自己的问题:

我必须编写一个新键:HKCR\SystemFileAssociations\.arw\shellex\PropertySheetHandlers以及一个子键,其中我的属性表处理程序名称的默认值等于其 CLSID。

这在Microsoft 文档“关联数组”

我在问题的源代码中添加了以下代码:

    SubKey := 'SystemFileAssociations\' + FileExt;
    if Reg.OpenKey(SubKey, FALSE) then begin
        Reg.CloseKey;
        SubKey := SubKey + '\ShellEx\PropertySheetHandlers\' + ProgName;
        if not Reg.OpenKey(SubKey, TRUE) then begin
            MyMessageBox('Unable to open key "HKCR\%s"', [SubKey]);
            Exit;
        end;
        Reg.WriteString('', ClassID);
        Reg.CloseKey;
    end;

鸣谢:我得到了 Anders M. 的帮助并找到了解决方案。

相关内容