我正在尝试创建一个简单的* .cpl小程序,它调用* .exe文件。
我有这段代码:
uses
shellapi;
procedure TAppletModule1AppletModule.AppletModuleActivate(Sender: TObject;
Data: Integer);
begin
ShellExecute(0, 'open', 'Control Panel_betteryless.exe', '', '', SW_NORMAL);
end;
当我双击Project1.cpl时,没有任何反应。当我在System32目录中复制Project1.cpl时,控制面板中不会添加任何其他条目。
我做错了什么?
更新以下是我尝试的实际情况:
数字化仪的供应商在2011年发布了他们的驱动程序。它们与Windows 10不兼容。它与Windows 7完全兼容。但是,我发现了一些如何强制执行兼容性的调整,因此设备现在正常工作。
该驱动程序包含一个名为 tablet.cpl 的CPL和 Control Panel_betteryless.exe [sic!],它们安装在 System32 中。不知何故,安装程序没有注册 tablet.cpl 。通过doubleclick运行控制Panel_betteryless.exe 。现在我想让这个CPL或EXE出现在控制面板中(最后,我想修改驱动程序,所以我有一个"固定的驱动程序"用于将来的安装)。
我创建了以下注册表项:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Cpls\tablet.cpl]
"RunLevel"=dword:00000000
但在控制面板中,没有添加任何项目。
为了确保CPL没有缺陷,我已将telephon.cpl
复制为tablet.cpl
并再次尝试。我希望Telephony条目现在在控制面板中两次。但没有改变。
答案 0 :(得分:2)
您可以在.cpl
文件夹中放置一个32位%SystemRoot%\SysWow64
文件,在.cpl
文件夹中放置一个64位%SystemRoot%\System32
文件,这两个文件都将显示在控制面板中必须注册他们。但是,如果要将.cpl
文件存储在其他位置,则必须明确注册,如文档中所述:
How to Register DLL Control Panel Items
例如:
32位
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Control Panel\Cpls
[REG_EXPAND_SZ] "MyCpl" = "%ProgramFiles%\MyApp\MyApplet.cpl"
64
HKLM\Software\Microsoft\Windows\CurrentVersion\Control Panel\Cpls
[REG_EXPAND_SZ] "MyCpl" = "%ProgramFiles%\MyApp\MyApplet.cpl"
无论您放置.cpl
文件的位置,默认情况下,只有当“查看方式”字段设置为“大图标”或“小图标”时,小程序才会显示在“控制面板”中。如果您希望applet显示在特定类别中,则必须注册,例如:
32位
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Control Panel\Extended Properties\System.ControlPanel.Category
[REG_DWORD] "%ProgramFiles%\MyApp\MyApplet.cpl" = 1
64
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Control Panel\Extended Properties\System.ControlPanel.Category
[REG_DWORD] "%ProgramFiles%\MyApp\MyApplet.cpl" = 1
如果您希望小程序显示在多个类别中,请使用REG_SZ
代替REG_DWORD
。实际数字记录在这里:
Assigning Control Panel Categories
在我的示例中,我使用的是Appearance and Personalization
类别。
现在,据说,Delphi 32bit .cpl
在Windows 10上工作正常,但在Windows 10上有64位.cpl
崩溃,在{{1}之前有两条弹出EAccessViolation
消息然后触发事件(Windows 7上不会发生TAppletModule.OnActivate
错误)。我不知道为什么它会崩溃,也许微软在applet初始化过程中EAccessViolation
API改变了一些CplApplet()
没有考虑到的东西(我没有在Windows 10上安装Delphi来调试它)。但是,TAppletModule
无论如何都是遗留的,不应该用于新的applet。您可以根据文档注册.cpl
本身直接显示在控制面板中:
How to Register Executable Control Panel Items
例如:
Control Panel_betteryless.exe
其中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace\{guid}
(Default) = "betteryless"
HKEY_CLASSES_ROOT\CLSID\{guid}
(Default) = "betteryless"
[REG_SZ] "System.ControlPanel.Category" = "1"
HKEY_CLASSES_ROOT\CLSID\{guid}\Shell\Open\Command
(Default) = [REG_EXPAND_SZ] "%SystemRoot%\System32\Control Panel_betteryless.exe"
是您创建的GUID,例如Delphi中的 CTRL + SHIFT + G 键盘组合代码编辑器。