2012-01-14 78 views
1

我的软件作为外壳扩展工作,并注册自己在Background/Directory和Desktop右键菜单上显示。我在Win XP上开发,它运行良好,但是现在当我在Windows 7上测试它时,不想工作的很好。上下文项仅在桌面右键菜单中存在,但不在背景/目录上。需要帮忙!ContextMenu项目扩展在Windows 7中不起作用

这里是德尔福的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; 
+0

Windows 7改变了很多,我记得打印机上下文菜单的位置也改变了... – dreamlax 2012-01-14 05:56:21

+0

确定Windows 7系统没有运行64位Explorer?如果你在XP上开发,你几乎肯定在32位。 Windows 7最常见于64位变体,而针对32位资源管理器编写的许多外壳扩展将无法注册到64位资源管理器。 – 2012-01-14 07:45:40

+0

它的32位肯定!问题是,它已成功注册,但只能在桌面上使用,而不是在xp – teMkaa 2012-01-14 07:54:30

回答

0

我找到了!在XP我写信给

\Directory\Background\Shell**Ex**\**ContextMenuHandlers**\CLSID 

但在Windows 7中的路径应

\Directory\Background\Shell\Name of your app\command 

,并命令我们把一个路径,我们在双引号 “%PATH%” 的应用程序。:)

2

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

您没有指定任何Access权限,因此它默认为KEY_ALL_ACCESS,仅限管理员使用。 Vista和后来的管理员用户没有完全的管理员权限,就像他们在XP中一样。如果UAC已启用,请确保您的应用程序在提升状态下运行。 右键单击.exe并选择“以管理员身份运行”,或为您的.exe提供一个指定“requestedExecutionLevel = requireAdministrator”的UAC清单。如果您不希望主应用程序运行提升,请将注册表逻辑移入单独的.exe或COM对象,然后在需要时运行提升。您可以致电HKEY_CLASSES_ROOT。不要那样做。 MSDN同样表示。你可以从它读取,但不要写入它。您需要写入HKEY_CURRENT_USER\Software\ClassesHKEY_LOCAL_MACHINE\Software\Classes,具体取决于您是否需要为当前用户或所有用户注册您的外壳扩展。

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

+0

感谢您的建议,但我不同意他们。如果您查看msdn - http://msdn.microsoft.com/en-us/library/windows/desktop/cc144110(v=vs.85).aspx,您将看到我必须完全在HKEY_CLASSES_ROOT中编写。关于访问写入,我尝试以管理员身份运行,并添加了上下文项目,但仅在桌面上。不在文件夹背景中。 – teMkaa 2012-01-14 07:21:18

+1

CLASSES_ROOT是[CURRENT_USER | LOCAL_MACHINE] \ Software \ Classes的一个合并视图,所有较旧的代码示例和文档都将其列为HKEY_CLASSES_ROOT,但这并不意味着您应该在那里写入(写入可以在机器上安装在pre x64/UAC /注册表反射和重定向的世界,其中“everyone”是管理员) – Anders 2012-01-14 07:55:25

+0

@Anders谢谢,我的错) – teMkaa 2012-01-14 08:00:08