“InvalidCastException未处理”

时间:2014-11-19 17:30:23

标签: c# visual-studio-2012

我正在尝试使用可以告诉我所有视频总时间的应用。它不实用,它只是提高编码能力的一种做法:)

这一行是错误

Shell32.Shell shell = new Shell32.Shell();

这就是错误

  

无法将“System .__ ComObject”类型的COM对象强制转换为接口   输入'Shell32.Shell'。操作中出现错误,因为   QueryInterface在具有IID的接口的COM组件上调用   '{} 286E6F1B-7113-4355-9562-96B7E9D64C54'生成以下内容   错误:不支持此类接口(HRESULT异常:0x80004002   (E_NOINTERFACE))。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Shell32;

namespace cuentavideosconsola
{
    class Program
    {
    static void Main(string[] args)
    {
        double contartiempo = 0;
        Shell32.Shell shell = new Shell32.Shell();
        Shell32.Folder carpeta;

        carpeta = shell.NameSpace(@"D:\");

        foreach(Shell32.FolderItem2 item in carpeta.Items()){
            Console.WriteLine(carpeta.GetDetailsOf(item,27));
            TimeSpan tiempo = TimeSpan.Parse(carpeta.GetDetailsOf(item,27));
            contartiempo += tiempo.TotalSeconds;
        }
        Console.WriteLine("El total de tiempo de los videos es: " + contartiempo);
        Console.ReadLine();
      }
   }
}

2 个答案:

答案 0 :(得分:0)

确保从Windows / system32 Add Reference Shell32.dll

即使您正在构建x86,引用也必须指向windows / system32文件夹。

答案 1 :(得分:0)

显然,这是Windows 8中的一项功能,导致您的原始代码无法正常工作。 我在这里找到了答案:

How to use Shell32 within a C# application?

我在下面更新了您的代码。经过测试并可在Win 8专业版上使用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Shell32;



namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
  double contartiempo = 0;
  //Shell32.Shell shell = new Shell32.Shell();
  Shell32.Folder carpeta;

  carpeta = GetShell32Folder(@"D:\");

  foreach (Shell32.FolderItem2 item in carpeta.Items()) {
    Console.WriteLine(carpeta.GetDetailsOf(item, 27));
    TimeSpan tiempo = TimeSpan.Parse(carpeta.GetDetailsOf(item, 27));
    contartiempo += tiempo.TotalSeconds;
  }
  Console.WriteLine("El total de tiempo de los videos es: " + contartiempo);
  Console.ReadLine();
}

private static Shell32.Folder GetShell32Folder(string folderPath)
{
  Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
  Object shell = Activator.CreateInstance(shellAppType);
  return (Shell32.Folder)shellAppType.InvokeMember("NameSpace",
  System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folderPath     });
}

  }
}