1

我使用 Shell 来获取控制面板

代码 :

var
  psfDeskTop: IShellFolder;
  psfControl: IShellFolder;

  pidControl: PITEMIDLIST;
  pidChild: PITEMIDLIST;
  pidAbsolute: PItemIdList;

  pEnumList: IEnumIDList;
  celtFetched: ULONG;

  FileInfo: SHFILEINFOW;

begin

  OleCheck(SHGetDesktopFolder(psfDeskTop));
  OleCheck(SHGetSpecialFolderLocation(0, CSIDL_CONTROLS, pidControl));
  OleCheck(psfDeskTop.BindToObject(pidControl, nil, IID_IShellFolder, psfControl));
  OleCheck(psfControl.EnumObjects(0, SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN or SHCONTF_FOLDERS, pEnumList));

  while pEnumList.Next(1, pidChild, celtFetched) = 0 do
  begin

    pidAbsolute := ILCombine(pidControl, pidChild);
    SHGetFileInfo(LPCTSTR(pidAbsolute), 0, FileInfo, SizeOf(FileInfo), SHGFI_PIDL
      or SHGFI_DISPLAYNAME);
    Memo1.Add(FileInfo.szDisplayName);

  end;

end;

它只能获得 32 位的控制面板,例如:BDE 管理员(32 位)、Flash Player(32 位),而我的操作系统是 x64,我想知道如何获得所有(32 位和 64 位)控制面板?

4

1 回答 1

2

您需要将代码编译为 64 位进程才能看到 64 位控制面板项。这需要 XE2 或更高版本。当我在 64 位进程中尝试您的代码时,输​​出如下:

NVIDIA nView 桌面管理器
电源选项
通知区域图标
任务栏和开始菜单
凭证管理器
默认程序
RemoteApp 和桌面连接
Windows Live 语言设置
Windows更新
桌面小工具
Windows 防火墙
电话和调制解调器
语音识别
用户帐户
地区和语言
家庭组
老鼠
文件夹选项
键盘
装置经理
Windows CardSpace
性能信息和工具
程序和特点
索引选项
网络和共享中心
自动播放
同步中心
恢复
互联网选项
设备和打印机
色彩管理
备份还原
系统
活动中心
字体
Windows 随时升级
展示
故障排除
入门
管理工具
轻松访问中心
Windows Defender的
日期和时间
位置和其他传感器
个性化
声音
Java(32 位)
DirectX
瑞昱高清音频管理器
BDE 管理员(32 位)
Advansys Formativ(32 位)
邮件(32 位)
Microsoft Mail 邮局(32 位)
Flash 播放器(32 位)
英伟达控制面板

在 32 位进程中,输出为:

爪哇
BDE 管理员
Advansys Formativ
邮件
微软邮件邮局
Flash播放器

请注意,64 位进程枚举 32 位项以及 64 位项。

于 2012-11-05T09:19:35.853 回答