我编写了一个属性表外壳扩展来显示文件中的元数据。它完美适用于诸如 之类的新文件类型.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;
答案1
回答我自己的问题:
我必须编写一个新键:HKCR\SystemFileAssociations\.arw\shellex\PropertySheetHandlers
以及一个子键,其中我的属性表处理程序名称的默认值等于其 CLSID。
我在问题的源代码中添加了以下代码:
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. 的帮助并找到了解决方案。