我的软件作为 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\Classes
或 HKEY_LOCAL_MACHINE\Software\Classes
,具体取决于您是需要为当前用户还是所有用户注册 Shell 扩展.
您忽略了 OpenKey()
和 CreateKey()
的返回值,以确保在写入之前成功打开/创建 key 。
关于c++ - ContextMenu 项目扩展在 Windows 7 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860459/