jjzjj

windows - 为来自 delphi 的 PDF 文件添加资源管理器上下文菜单项

coder 2024-06-04 原文

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

我从 How to associate a Delphi program with a file type, but only for the current user? 开始和 How to add item to windows explorer content menu in delphi? .我通过 regedit 通过手动注册表编辑对其进行了测试,它对"new"扩展工作正常。但对于 .pdf 来说,它更复杂,因为它很可能已经存在于注册表中。

在我的电脑上,.pdf key 引用的是 AcroExch.Document 。但是向 AcroExch.Document key 添加 shell/something 子项不起作用,因为它具有引用 AcroExch.Document.7 的 CurVer 子项。然而,另一台装有 Acrobat 另一个版本的 PC 的名称略有不同。遵循 CurVer 引用对我来说没有问题,但这是正确的方法吗?在没有安装 PDF 阅读器的情况下,我应该如何命名我的 key 以便 Acrobat 在安装时不会覆盖它们?

但更紧迫的问题是我应该把我的 key 放在哪个根目录下? How to associate a Delphi program with a file type, but only for the current user?提到 HKLM(本地机器)和 HKCU(当前用户)。它看起来相当简单,但我无法在 Delphi 的 HKLM 中设置值。奇怪的是我可以创建 key :

var reg:TRegistry;

key := '\Software\Classes\'+keyname+'\shell\'+name+'\command';
reg.CreateKey(key);

但是我在尝试写入实际值时遇到访问被拒绝的问题:

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

即使在 WinXP 上,我也遇到相同的拒绝访问异常,无论应用程序是否以管理员身份运行 (Win7),我什至尝试通过 regedit 为 key 设置权限(所有人完全控制)(我可以编辑值通过 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 并且它有效,如果以管理员身份运行,它实际上会将 key 准确地放在我想要的地方(进入 HKLM)。但是根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475.aspx

The HKEY_CLASSES_ROOT (HKCR) key contains file name extension associations and COM class registration information such as ProgIDs, CLSIDs, and IIDs. It is primarily intended for compatibility with the registry in 16-bit Windows.

我不喜欢关于主要目的是与 16 位 Windows 兼容的注释。写入更改的实际情况比我想要的要复杂。

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

  • 使用 AcroExch.Document 和 CurVer 而不是直接指向 AcroExch.Document.7 有什么好处?将我的 key 添加到此结构中时,“最佳礼仪”是什么?如果 .pdf 尚未与任何内容相关联怎么办?

  • 我应该把我的 key 放在哪里,为什么我不能写入 HKLM?

编辑: 写入HKLM时出现Access Denied的问题是我的错误导致的。我确实在之前的代码中使用了 openKeyReadOnly,但我没有注意到它会为所有后续调用将 Access 属性切换为只读。

最佳答案

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

关于windows - 为来自 delphi 的 PDF 文件添加资源管理器上下文菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21091729/

有关windows - 为来自 delphi 的 PDF 文件添加资源管理器上下文菜单项的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  5. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  6. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  7. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  10. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

随机推荐