c++ - ContextMenu 项目扩展在 Windows 7 中不起作用

标签 c++ c delphi winapi contextmenu

我的软件作为 shell 扩展运行,并注册自己以显示在背景/目录和桌面右键单击菜单上。我在 Win XP 上开发并且它运行良好,但现在当我在 Windows 7 上测试它时,不希望运行良好。上下文项仅存在于桌面右键单击菜单中,但不存在于背景/目录中。需要帮助!

这是 Delphi 中的 reg 函数,但可以接受任何语言的示例,如果需要,我可以显示扩展 DLL src!

const
  CLSID_ContextMenu = '{AB69D961-B907-11D0-B8FA-A85800C10000}';

procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    with Reg do
    begin
      RootKey := HKEY_CLASSES_ROOT;
      OpenKey('\CLSID\' + CLSID_ContextMenu, True);
      WriteString('', 'Context Menu Shell Extension');
      OpenKey('\CLSID\' + CLSID_ContextMenu + '\InProcServer32', True);
      WriteString('', ExtractFilePath(Application.ExeName) + '\Project1.dll');
      WriteString('ThreadingModel', 'Apartment');
      CreateKey('\Directory\Background\ShellEx\ContextMenuHandlers\' + CLSID_ContextMenu);
    end;
  finally
    Reg.Free;
  end;
end;

最佳答案

您在使用 TRegistry 时犯了一些重大错误。

您没有指定任何Access 权限,因此它默认为KEY_ALL_ACCESS,仅限管理员使用。 Vista 及更高版本中的管理员用户不像在 XP 中那样拥有完全的管理员权限。如果启用了 UAC,请确保您的应用程序以提升的状态运行。 右键单击 .exe 并选择“以管理员身份运行”,或者为您的 .exe 提供指定“requestedExecutionLevel=requireAdministrator”的 UAC list 。如果您不希望您的主应用以提升的方式运行,请将注册表逻辑移动到一个单独的 .exe 或 COM 对象中,然后您可以在需要时以提升的方式运行。

您正在写入 HKEY_CLASSES_ROOT。不要那样做。 MSDN 说了这么多。您可以从中读取,但不要写入。您需要改为写入 HKEY_CURRENT_USER\Software\ClassesHKEY_LOCAL_MACHINE\Software\Classes,具体取决于您是需要为当前用户还是所有用户注册 Shell 扩展.

您忽略了 OpenKey()CreateKey() 的返回值,以确保在写入之前成功打开/创建 key 。

关于c++ - ContextMenu 项目扩展在 Windows 7 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860459/

相关文章:

c++ - 有没有什么方法可以在没有 std::move 的情况下调用 C++ 中的移动赋值运算符?

c++ - 在 C++ 中将 TCP 服务器数据包保存到文件

c++ - 在 Turbo C++ 中,可以将普通递归函数转换为尾递归来优化它吗?

python - 当客户端愉快地发送它们时,为什么 TCP 数据包总是无法到达服务器?

c++ - C/C++大数计算

c - 如果输入是负数或字母,我如何让我的 if 语句要求用户重试?

delphi - 在 Treeview 中禁用和更改节点的颜色

delphi - 标准对话框不弹出

Delphi 2009 'treat warnings as errors' 选项在哪里?

c++ - 如何有效地计算 vector 的余切