Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 上下文菜单项扩展在Windows 7中不起作用_C++_C_Delphi_Winapi_Contextmenu - Fatal编程技术网

C++ 上下文菜单项扩展在Windows 7中不起作用

C++ 上下文菜单项扩展在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

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

这里是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
时犯了一些重大错误

您没有指定任何
访问权限
权限,因此它默认为
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根
本身工作原理的更详细信息以及如何在实践中使用。请参见和