首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COMException从Plex插件访问WMP (使用Pythonfor.NET)

COMException从Plex插件访问WMP (使用Pythonfor.NET)
EN

Stack Overflow用户
提问于 2014-07-14 05:23:02
回答 1查看 416关注 0票数 3

我的目标

我正在尝试为Plex媒体服务器创建一个插件,该插件将与WMP (Windows )接口,以获取有关Windows项的元数据。

设置

  • PMS使用Python2.7作为主脚本主机。Plex插件是用Python编写的,尽管它们是在沙箱中运行的。不幸的是,关于这个沙箱功能的边界是什么的文档很少。
  • 我决定使用Pythonfor.NET来访问Windows以与WMPLib接口。Python ( .NET,http://pythonnet.github.io/)是一个Python库,用于从.NET运行时中访问来自.NET程序集的功能。
  • 我创建了一个.NET程序集来访问WMPLib,它是Windows的一部分,旨在以编程方式访问WMP的功能。WMPLib基本上是.NET针对wmp.dll的COM互操作包装器。

什么起作用?

从Python到基于COM的WMP访问的整个链都在工作。如果我启动Plex Media (Python2.7的一个版本)附带的嵌入式Plex脚本主机,我可以很容易地从WMP访问数据。这意味着链中的下列链接都在工作:

  • Python正在为.NET加载Python
  • 用于.NET的Python正在加载我的.NET程序集
  • 我的.NET程序集正在加载WMPLib (Interop.WMPLib.dll,COM互操作的.NET程序集)
  • WMPLib正在成功地打开和利用wmp.dll (从C:\Windows\System32 32访问)

什么不管用?

激活这个链的COM Interop部分在沙箱Plex插件中不起作用。同样,这个插件是用标准Python编写的,但是一旦沙箱代码运行,Python执行环境就会有一些微妙的不同。在插件中运行WMP访问代码时,我会得到以下异常:

代码语言:javascript
复制
COMException: Exception from HRESULT: 0xC00D1327
   at WMPLib.IWMPPlayer4.get_mediaCollection()
  • 在这个场景中,我知道Pythonfor.NET正在工作,因为此时我已经从我的.NET程序集加载和访问了其他东西。
  • C:\Windows\System32位于PATH变量的前面。我假设COM dll应该通过PATH环境变量( )定位,但我并不完全确定这一点。如何在这个独特的场景中定位COM程序集(Python .NET访问COM)是最大的未知数之一。

问题

  1. Plex插件沙箱如何改变Python执行环境,使访问COM程序集不再有效?
  2. 在这种情况下,环境应该如何定位和访问COM程序集?
  3. 它是否需要Plex沙箱可能已经锁定的特定权限?

也许我至少应该赢得一些奖励,因为我找到了一个问题,这个问题以一种独特的、令人困惑的方式交叉了这么多不同的技术。

编辑1

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

代码语言:javascript
复制
COMError: (-1072884953, None, (None, None, None, 0, None))

虽然-1072884953是一种不同的错误代码,但稍微仔细研究一下,就会发现该错误与(可能相当于?)相关。与我通过.NET互操作时遇到的相同错误(这个职位使它看起来是这样)。

所以现在我所坚持的事实是:

  1. wmp.dll在所有情况下都在加载( @Paulo帮助我理解了下面的内容)。
  2. 当在Plex沙箱环境之外运行访问WMP的代码时,可以从WMP访问库项。
  3. 当在Plex沙箱环境中运行访问WMP的代码时,无法从WMP访问库项。
  4. 我得到的错误代码(无论是来自.NET还是基于Python的COM互操作)是NS_E_CURL_INVALIDPATH: The URL contains a path that is not valid.,在大多数情况下,这个错误似乎与尝试回放有关。
  5. 这很奇怪,因为我从来没有在我的场景中重放过.我只想给wmp.mediaCollection打电话

因此,Plex沙箱似乎确实是这个场景中的关键。还有更多的想法吗?

编辑2

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

代码语言:javascript
复制
from comtypes.client import CreateObject

wmp = CreateObject("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")
collection = wmp.mediaCollection

错误发生的地方就是collection = wmp.mediaCollection

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

EN

回答 1

Stack Overflow用户

发布于 2014-07-17 16:20:44

让我直截了当,如果我错了就纠正我:

  • 您有一个运行中的Python2.7,Plex Media Server实例
  • 您正在使用一个库(Pythonfor.NET)将一个.NET加载到您的进程中
  • 在.NET中加载.NET,这是一个导入的COM互操作程序集,以便通过Pythonfor.NET使用库

让我们澄清这一点:

  • NS_E_CURL_INVALIDPATH: URL包含无效的路径。

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

  • DLL搜索顺序与它没有什么关系,因为wmp.dll是为每个提供的类在InProcServer32注册表项下使用完整路径注册的,这才是最重要的。 事实上,正如您所说的,如果您已经达到了这一点,那么加载.NET程序集或COM没有找到DLL显然不是一个问题。

现在,关于以下问题:

  1. 由于错误似乎是合法的,您可能无法访问媒体集合(Internet专区?),或者WMP未正确注册/安装,或某些编解码器丢失或未正确注册/安装等等。 你要把什么装进WMP?尝试一些基本的东西,例如本地.WAV、.MP3、.AVI和.MPG文件,然后尝试更高级的格式,例如MPEG4 4编码的视频,或者可能是远程位置。
  2. 您应该尝试一种更直接的方法,尽管我不能确定哪个更好:win32com (pywin32的一部分)还是共形。 很久以前,我就已经看过它们了,所以请稍微考虑一下:对于comtype,您可以使用COM对象,就像普通的带有属性和方法的Python对象一样,而win32com似乎更倾向于通过运行时名称分配来完成一些事情。 至少,您将使用一些真正需要忍受的东西(Python),而不是为一些甚至不需要它的东西加载.NET (WMP)。
  3. 我不知道沙箱是关于什么的,但我的猜测是它是一个只使用Python的沙箱,而不是限制操作系统使用的东西。

编辑:您是否提供了一个文件名(例如,file:///C:/path/to/file.mp4),),其中需要一个URL (反之亦然)?我想您必须显示失败的代码和正在提供的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24729976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档