从delphi中为PDF文件添加资源管理器上下文菜单项

我有我用Delphi XE编写的与PDF文件一起使用的应用程序。 应用程序是Win32。 在开始时,我想确保在PDF文件的资源管理器上下文菜单中有我的项目。 我希望能够指定是应该为活动用户添加还是为所有用户添加(使用UAC,我需要使用管理员权限重新启动,但那样可以)。

我从如何将Delphi程序与文件类型关联开始,但只针对当前用户? 以及如何将项目添加到delphi中的Windows资源管理器内容菜单? 。 我使用regedit通过手动注册表编辑来测试它,并且它适用于“新”扩展。 但对于.pdf而言,它更复杂,因为它很可能已经存在于注册表中。

在我的PC上,.pdf键引用了AcroExch.Document。 但将AcroExch.Document关键字添加shell / something子键不起作用,因为它具有引用AcroExch.Document.7的CurVer子项。 然而另一台装有Acrobat另一个版本的PC却有一些不同。 遵循CurVer参考对我来说没有问题,但这是一个正确的方法吗? 那么没有安装PDF阅读器的情况如何,我应该如何命名我的密钥,以便Acrobat在安装时不会覆盖它们?

但更迫切的问题是我应该把钥匙放在哪根? 如何将Delphi程序与文件类型相关联,但仅限于当前用户? 提到HKLM(本地机器)和HKCU(当前用户)。 它看起来相当简单,但我无法从德尔福的HKLM中设定价值。 奇怪的是我可以创建密钥:

var reg:TRegistry;

key := 'SoftwareClasses'+keyname+'shell'+name+'command';
reg.CreateKey(key);

但在尝试写入实际值时遇到拒绝访问:

reg.OpenKey(key,false);
reg.WriteString('',command);

即使在WinXP上,我也会得到相同的Access Denied异常,无论应用程序是否以Admin(Win7)运行,我甚至尝试通过regedit设置密钥的权限(每个人都可以完全控制)(我可以通过regedit编辑值问题)。 我试图用不同的访问模式创建注册表,所有这些都没有运气:

reg := TRegistry.Create(KEY_WRITE or KEY_WOW64_64KEY);
reg := TRegistry.Create(KEY_ALL_ACCESS or KEY_WOW64_64KEY);
reg.Access := KEY_ALL_ACCESS;
reg.Access := KEY_WRITE or KEY_WOW64_64KEY;
reg.Access := KEY_ALL_ACCESS or KEY_WOW64_64KEY;

HKCU一切正常。

所以我尝试写入HKEY_CLASSES_ROOT并且它工作正常,并且如果以Admin身份运行,它实际上将键放到我想要的地方(进入HKLM)。 但根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475.aspx

HKEY_CLASSES_ROOT(HKCR)键包含文件扩展名关联和COM类注册信息,如ProgID,CLSID和IID。 它主要用于与16位Windows中的注册表兼容。

我不喜欢关于与16位Windows兼容的主要目的的说明。 而且写入更改的实际情况比我想要的要复杂得多。

所以基本上我有这些问题:

  • 使用AcroExch.Document和CurVer代替直接指向AcroExch.Document.7的优点是什么? 在我的钥匙加入这个结构时,什么是“最好的礼仪”? 关于.pdf还没有关联的情况呢?

  • 我应该在哪里放钥匙,为什么我不能写入HKLM?

  • 编辑:写入HKLM时访问被拒绝的问题是由我的错误引起的。 我在前面的代码中使用了openKeyReadOnly,我没有注意到它会将Access属性切换为只读的所有后续调用。


    你问了两个单独的问题。 既然我知道答案而不是其他答案,我只会回答一个答案。 为了将来的参考,我建议您一次提出一个问题。

    我应该在哪里放钥匙?

    你明白你不应该使用HKCR是正确的。 HKCR的文件说:

    类注册和文件扩展名信息存储在HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER键下。 HKEY_LOCAL_MACHINE Software Classes项包含可应用于本地计算机上的所有用户的默认设置。 HKEY_CURRENT_USER Software Classes项包含仅适用于交互式用户的设置。 HKEY_CLASSES_ROOT键提供了合并来自这两个源的信息的注册表视图。 HKEY_CLASSES_ROOT还为为以前版本的Windows设计的应用程序提供了此合并视图。

    ....

    如果您将密钥写入HKEY_CLASSES_ROOT下的密钥,则系统会将信息存储在HKEY_LOCAL_MACHINE Software Classes下。 如果您将值写入HKEY_CLASSES_ROOT下的密钥,并且密钥已存在于HKEY_CURRENT_USER Software Classes下,系统将在那里存储信息而不是在HKEY_LOCAL_MACHINE Software Classes下。

    因此,使用HKCR进行阅读是合理的,但对于书写,您通常需要控制是否写入HKLMHKCU 。 这意味着你不能写信给HKCR

    因此,请写入HKLMSoftwareClasses以获取机器范围的设置,并写入HKCUSoftwareClasses以获取用户特定的设置。

    请注意,在Windows 7和更高版本中,这些键都不会重定向,因此您无需担心使用KEY_WOW64_64KEY 。 但是,在Vista和XP64以及等效的服务器版本中,这些密钥会被重定向并反映出来。 这意味着可以谨慎使用KEY_WOW64_64KEY


    要回答您的其他问题,如果Adobe尚未安装,那么显然PDF注册表项可能不存在于注册表中,因此您必须创建自己的.pdf和ProgID密钥,以便您可以在其上附加Shell命令。 如果之后安装了Adobe,它很可能会清除您的密钥并将其替换为自己的密钥,因此您必须在Adobe的密钥结构中重新创建Shell命令。 您的应用程序可以查询注册表以定期检查该情况,例如在启动时。

    链接地址: http://www.djcxy.com/p/91075.html

    上一篇: Add explorer context menu item for PDF files from delphi

    下一篇: I cannot install TeeChart2013 for Delphi 7