【发布时间】:2014-04-27 18:27:43
【问题描述】:
目前我有一个 PowerShell 脚本,它能够使用 Shell.Application COMobject 在我的控制面板中获取程序列表。我需要将其转换为 C#,但我似乎无法正确处理。关于我做错了什么有什么建议吗?
下面显示的 C# 代码不会返回任何错误消息。它只是运行(因为它是空的)。当我从 C# 示例中删除 if 语句时,我得到“对象引用未设置为对象的实例。”。我知道我的文件夹变量为空,但我不明白为什么?
向我的项目添加了 Shell32.Dll(C:\Windows\System32\shell32.dll) 引用。 添加了 Shell32 Using 指令
(工作)PowerShell代码
$Shell = New-Object -ComObject Shell.Application
$folderName = "::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\" +
"::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");
$folder = $Shell.NameSpace($folderName)
if($folder)
{
$folder.Items()
}
(不工作)C#代码
Type t = Type.GetTypeFromProgID("Shell.Application");
Shell s = (Shell)Activator.CreateInstance(t);
var objNameSpace = s.NameSpace(@"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");
if (objNameSpace != null)
{
MessageBox.Show(objNameSpace.Items().Count.ToString());
}
(更多不工作)C# 代码。第二种方法
Shell32.Shell shell = new Shell32.Shell();
Shell32.Shell objShell = shell.Application;
var objShellFolder = objShell.NameSpace(@"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}");
if(objShellFolder != null)
{
MessageBox.Show(objShellFolder.Items().ToString());
}
【问题讨论】:
-
你能澄清一下“不工作”是什么意思吗?您在 both C# 示例中遇到什么错误?
-
@TrevorSullivan 这会有所帮助,不是吗?我每次都得到一个空引用。 “你调用的对象是空的。”这仅在我删除 if 语句时发生。使用 If 语句,它什么都不做。 - 将编辑帖子以反映此评论。
-
你为什么要这样做?查询 `HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall` 会给你 99% 的应用程序,不是吗?而且使用起来更容易
-
@FrodeF 是的,它会给我每个写入注册表的程序。主要问题是一个算法,它将整理所有那些只能向我展示我控制面板中的内容的垃圾。没有我可以过滤掉的独特属性可以做到这一点。
标签: c# winforms powershell com