C# 获取程序和功能列表

C# 获取程序和功能列表,c#,winforms,C#,Winforms,根据中的代码,我用C编写了以下代码# 出于什么原因,objProgramList是null。奇怪的是,通过下面的powershell代码,我得到了我想要的东西!我不知道我做错了什么。对我来说,我的两个代码示例都是相同的 $Shell = New-Object -ComObject Shell.Application $folderName = "::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E- E

根据中的代码,我用C编写了以下代码#

出于什么原因,
objProgramList
null
。奇怪的是,通过下面的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()  
}    

你有没有可能使用8号窗口?据介绍,在windows8中创建这样的shell是行不通的。

这个答案太晚了,但它可能会帮助其他人解决同样的问题

基本上,代码中的问题是shell命令:

string folderName = @"::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\" +
    "::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}";
它应该包含“shell:”在命令的开头,它应该如下所示:

string folderName = @"shell:::{26EE0668-A00A-44D7-9371-BEB064C98683}\8\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}"
要获取有关程序的信息,如名称、发布者、安装位置等,请尝试以下代码,该代码将枚举所有可用字段:

List<string> arrHeaders = new List<string>();
for (int i = 0; i < short.MaxValue; i++)
{
    string header = list.GetDetailsOf(null, i);
    if (String.IsNullOrEmpty(header))
        break;
    arrHeaders.Add(header);
}

foreach (Shell32.FolderItem2 item in list.Items())
{
    for (int i = 0; i < arrHeaders.Count; i++)
    {
        //I used listbox to show the fields
        listBox1.Items.Add(string.Format("{0}\t{1}: {2}", i, arrHeaders[i], list.GetDetailsOf(item, i)));
    }
}
List arrHeaders=新列表();
对于(int i=0;i
您的文件夹名称不完全相同。在powershell中,路径中有一个很大的空白。这是打字错误吗?此外,请尝试将C#
folderName
压缩为单个字符串,而不是添加它们。@DLeh大空格是SO和Powershell代码的格式问题。由于SO的格式问题,foldername被分离。我当前的代码没有拆分字符串。Windows 7 64位企业版。
List<string> arrHeaders = new List<string>();
for (int i = 0; i < short.MaxValue; i++)
{
    string header = list.GetDetailsOf(null, i);
    if (String.IsNullOrEmpty(header))
        break;
    arrHeaders.Add(header);
}

foreach (Shell32.FolderItem2 item in list.Items())
{
    for (int i = 0; i < arrHeaders.Count; i++)
    {
        //I used listbox to show the fields
        listBox1.Items.Add(string.Format("{0}\t{1}: {2}", i, arrHeaders[i], list.GetDetailsOf(item, i)));
    }
}