COMException从Plex插件访问WMP(使用Python for.NET) 我的目标

COMException从Plex插件访问WMP(使用Python for.NET) 我的目标,python,.net,com,wmp,plex,Python,.net,Com,Wmp,Plex,我正在尝试创建一个插件,该插件将与WMP(Windows Media Player)接口,以获取有关Windows Media library项目的元数据 设置 PMS使用Python 2.7作为其主脚本主机。Plex插件是 用Python编写,但它们是以沙盒容量运行的。不幸的是,关于这个沙盒功能的边界究竟是什么的文档很少 我决定使用Python for.NET访问Windows SDK以与WMPLib接口。 Python for.NET()是一种Python 用于从中访问.NET程序集功能的

我正在尝试创建一个插件,该插件将与WMP(Windows Media Player)接口,以获取有关Windows Media library项目的元数据

设置
  • PMS使用Python 2.7作为其主脚本主机。Plex插件是 用Python编写,但它们是以沙盒容量运行的。不幸的是,关于这个沙盒功能的边界究竟是什么的文档很少
  • 我决定使用Python for.NET访问Windows SDK以与WMPLib接口。 Python for.NET()是一种Python 用于从中访问.NET程序集功能的库 Python运行时
  • 我创建了一个.NET程序集来访问WMPLib 是Windows SDK的一部分,设计用于以编程方式访问 WMP的功能。WMPLib基本上是 .NET目标wmp.dll
什么起作用了? 从Python到基于COM的WMP访问的整个链条都在工作。如果启动Plex Media Server(Python 2.7的一个版本)附带的嵌入式Plex脚本主机,我就可以轻松地从WMP访问数据。这意味着链中的以下链接都在工作:

  • Python正在为.NET加载Python
  • Python for.NET正在加载我的.NET程序集
  • 我的.NET程序集正在加载WMPLib(Interop.WMPLib.dll,用于COM互操作的.NET程序集)
  • WMPLib正在成功打开并使用wmp.dll(从C:\Windows\System32访问)
什么不起作用? 从沙盒Plex插件中激活此链的COM互操作部分不起作用。同样,这个插件是用标准Python编写的,但是一旦沙箱代码运行,Python执行环境就会发生微妙的变化。在插件中运行WMP访问代码时,我遇到以下异常:

COMException: Exception from HRESULT: 0xC00D1327
   at WMPLib.IWMPPlayer4.get_mediaCollection()
  • 在这个场景中,我知道Python for.NET正在工作,因为此时我已经从我的.NET程序集中加载并访问了其他东西
  • C:\Windows\System32位于PATH变量的前面。我假设COM DLL应该通过PATH环境变量定位(似乎是这样说的),但我并不完全确定这一点在这个独特的场景中(Python访问.NET访问COM),COM程序集应该如何定位是我最大的未知数之一
问题
  • Plex插件沙盒如何改变Python执行环境,从而使访问COM程序集不再工作
  • 在这种情况下,环境应该如何定位和访问COM程序集
  • 它是否需要Plex沙盒可能已锁定的特定权限
  • 也许我至少应该赢得一些奖项,因为我以一种独特的令人困惑的方式提出了一个涉及如此多不同技术的问题

    编辑1 由于@Paulo在下面的建议,我已经完全排除了任何与.NET相关的问题。我现在通过
    comtypes
    Python库与
    WMPLib
    进行所有互操作。现在我得到了以下错误:

    COMError: (-1072884953, None, (None, None, None, 0, None))
    
    虽然
    -1072884953
    是一个不同的错误代码,但仔细研究一下就会发现,这个错误似乎与我通过.NET interop时遇到的同一个错误有关(可能相当于?)

    所以现在我要面对的事实是:

  • wmp.dll
    在所有情况下都在加载(这是@Paulo帮我弄明白的) 在下面)
  • 当访问WMP的代码在Plex沙箱环境之外运行时,可以从WMP很好地访问库项
  • 当访问WMP的代码在Plex沙箱环境中运行时,无法从WMP访问库项
  • 我得到的错误代码(无论是来自.NET还是基于Python的COM interop)是
    NS\u E\u CURL\u INVALIDPATH:URL包含无效的路径。
    在大多数情况下,此错误似乎与尝试播放有关
  • 这很奇怪,因为在我的场景中,我从来没有达到播放的程度……我只是尝试调用
    wmp.mediaCollection
  • 所以Plex沙盒似乎是这个场景中的关键。还有其他想法吗

    编辑2 至少,这是失败所需的代码:

    from comtypes.client import CreateObject
    
    wmp = CreateObject("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")
    collection = wmp.mediaCollection
    
    发生错误的地方是
    collection=wmp.mediaCollection


    因此,实际上没有传递任何可能导致失败的参数。重申一下,这段代码在一般Python 2.7上下文中运行良好。它只在Plex插件沙盒中失败。我不知道如何获得Plex沙盒如何改变执行环境的详细信息。我想我的答案就在这个方向上n、

    让我直说,如果我错了,请纠正我:

    • 您有一个正在运行的Python2.7实例,Plex Media Server

    • 您正在使用Python for.NET库将.NET加载到进程中

    • 您正在.NET中加载WMPLib(一个导入的COM互操作程序集),以便通过Python for.NET使用Windows Media Player库

    让我们澄清一下:

    • :

      URL包含无效的路径

      这似乎是一个合法的对象错误,而不是COM错误

    • 与此无关,因为wmp.dll是在每个提供的类的注册表项下使用完整路径注册的,这才是最重要的

      事实上,正如您所说,如果您已经达到了这一点,那么加载.NET程序集或COM找不到DLL显然不是问题

    现在,请回答以下问题:

  • 由于错误似乎是合法的,您可能无法访问媒体集(Internet区域?),或者WMP未正确注册/安装,或者某些编解码器丢失或未正确注册/安装,等等

    你在装什么