C++ 上下文菜单项扩展在Windows 7中不起作用
我的软件作为shell扩展,并注册自己以显示在后台/目录和桌面右键单击菜单上。我在WinXP上开发,它运行良好,但现在我在Windows7上测试它时,不希望它运行良好。上下文项仅存在于桌面右键单击菜单中,而不存在于后台/目录中。需要帮助 这里是Delphi中的reg函数,但任何接受的语言的示例,如果需要,我可以显示扩展DLL srcC++ 上下文菜单项扩展在Windows 7中不起作用,c++,c,delphi,winapi,contextmenu,C++,C,Delphi,Winapi,Contextmenu,我的软件作为shell扩展,并注册自己以显示在后台/目录和桌面右键单击菜单上。我在WinXP上开发,它运行良好,但现在我在Windows7上测试它时,不希望它运行良好。上下文项仅存在于桌面右键单击菜单中,而不存在于后台/目录中。需要帮助 这里是Delphi中的reg函数,但任何接受的语言的示例,如果需要,我可以显示扩展DLL src const CLSID_ContextMenu = '{AB69D961-B907-11D0-B8FA-A85800C10000}'; procedure T
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
时犯了一些重大错误
您没有指定任何访问权限
权限,因此它默认为KEY\u ALL\u访问权限
,仅限管理员使用。Vista和更高版本中的管理员用户不像在XP中那样拥有完全的管理员权限。如果UAC已启用,请确保您的应用程序正在提升状态下运行。
右键单击.exe并选择“以管理员身份运行”,或者为.exe提供一个UAC清单,其中指定“requestedExecutionLevel=requireAdministrator”。如果不希望主应用程序运行提升版,请将注册表逻辑移动到单独的.exe或COM对象中,然后在需要时运行提升版
您正在向HKEY\U CLASSES\U ROOT
写信。不要那样做。MSDN也这么说。你可以读,但不要写。您需要改为向HKEY\U CURRENT\U USER\Software\Classes
或HKEY\U LOCAL\U MACHINE\Software\Classes
写入,具体取决于您是否需要为当前用户或所有用户注册Shell扩展
您正在忽略
OpenKey()
和CreateKey()
的返回值,以确保在写入密钥之前已成功打开/创建密钥。我找到了它!在XP中,我写信给
\Directory\Background\Shell**Ex**\**ContextMenuHandlers**\CLSID
但是在Windows7中,路径应该是
\Directory\Background\Shell\Name of your app\command
在命令中,我们将应用程序的路径放在双引号中“%path%”:)Windows 7更改了很多,我记得打印机上下文菜单的位置也更改了……您确定Windows 7系统没有运行64位资源管理器吗?如果你是在XP上开发的,你几乎肯定是在32位上。Windows 7最常见于64位版本,许多针对32位资源管理器编写的shell扩展将无法在64位资源管理器中注册。当然是32位!问题是,它已成功注册,但只能在桌面上工作,而不能像在XPS中那样在文件夹后台工作。您知道您的shell扩展不能在64位上工作吗?这对你们有关系吗?我当然需要64位的支持,但首先我需要解决上下文菜单的问题!我看到了你之前关于XE2和64编译器的帖子,谢谢。我必须更新我的IDE并在其中编译项目吗?或者需要一些代码更改吗?谢谢你的建议,但我不同意。如果你看msdn-,你会发现我必须用HKEY_CLASSES_ROOT准确地写。关于access写入,我尝试以管理员身份运行,并添加了上下文项,但仅在桌面上。不在文件夹background.CLASSES|u ROOT是[当前|用户|本地|u机器]\Software\CLASSES和所有旧代码示例和文档的合并视图,只是将其列为HKEY|u CLASSES_ROOT,但这并不意味着您应该在那里编写(在x64/UAC/registry reflection&redirection之前的世界中进行机器范围的安装时,在那里编写是很好的)“每个人”都是管理员)KEY\u ALL\u ACCESS对于安装来说似乎是合理的。注册表代码已经在注册功能中。您关于类\u根的说法是合理的。大多数关于注册的文档仅为简单起见参考
HKEY\u类\u根
,但MSDN提供了有关HKEY\u类\u根
本身工作原理的更详细信息以及如何在实践中使用。请参见和