代码之家  ›  专栏  ›  技术社区  ›  Judah Gabriel Himango

无法实例化C中的COM组件-错误80070002

  •  3
  • Judah Gabriel Himango  · 技术社区  · 15 年前

    我正在尝试在我的计算机上实例化Windows Media Player COM对象:

    Guid mediaPlayerClassId = new Guid("47ac3c2f-7033-4d47-ae81-9c94e566c4cc");
    Type mediaPlayerType = Type.GetTypeFromCLSID(mediaPlayerClassId);
    Activator.CreateInstance(mediaPlayerType); // <-- this line throws
    

    执行最后一行时,我得到以下错误:

    System.IO.FileNotFoundException was caught
      Message="Retrieving the COM class factory for component with CLSID {47AC3C2F-7033-4D47-AE81-9C94E566C4CC} failed due to the following error: 80070002."
      Source="mscorlib"
      StackTrace:
           at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
           at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
           at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
           at System.Activator.CreateInstance(Type type, Boolean nonPublic)
           at System.Activator.CreateInstance(Type type)
           at MyStuff.PreviewFile(String filePath) in F:\Trunk\PreviewHandlerHosting\PreviewHandlerHost.cs:line 60
      InnerException: 
    

    这个代码同样适用于其他开发人员机器和最终用户机器。由于某种原因,它只在我的机器上发生故障。原因可能是什么?

    4 回复  |  直到 10 年前
        1
  •  5
  •   Reed Copsey    15 年前

    80070002是“找不到文件”错误。

    我猜你的机器缺少依赖性。尝试通过depends.exe运行COM组件,以查看是否安装了所有必需的库。

        2
  •  2
  •   Ana Betts    15 年前

    嗯,0x80070002意味着找不到文件,所以我要检查在您的计算机上是否存在COM注册中指向的DLL

        3
  •  0
  •   saknet    14 年前

    如果应用程序池崩溃,则可能发生此错误。您可以检查您的代码,看是否最终有任何函数或对象初始化重复。这可能导致内存泄漏,并最终导致应用程序池崩溃。

        4
  •  0
  •   Mr AH    10 年前

    更多可能有用的信息。我们在加载.NET组件的经典ASP Web应用程序上看到了这个问题。一个应用程序很好,另一个不好。同一台机器?那又是什么呢?由于未能加载COM组件,我们没有得到正确的错误,只是错误号0x80070002。

    最终,通过将断开的应用程序的应用程序池设置为与工作应用程序相同,解决了这一问题。关于应用程序池的某些内容意味着无法正确加载组件、相同身份等(IIS6)。

    这个组件的注册表中有很多旧版本号,但regasm总是这样做,清理起来很糟糕,甚至在开发人员机器上的版本号之间移动时,我们还必须编写一个小工具来删除它们。但在本例中,这些版本号不是问题所在。

    结论:听起来像是权限问题,但我知道什么……