【问题标题】:WMP COM fails to operate under subsequent user impersonationsWMP COM 无法在后续用户模拟下运行
【发布时间】:2012-06-19 01:32:41
【问题描述】:

我有一个需要访问所有当前登录用户的 Windows Media Player 库的 Windows 服务。由于它是一项服务,因此我必须模拟登录用户,以便对 WMP COM 的调用将在模拟用户的上下文中返回信息(即返回模拟用户的库而不是系统的库)。我需要为每个登录的用户执行此操作。

我能够通过ImpersonateLoggedOnUser 在线程中成功模拟用户,获取用户的库,然后执行RevertToSelf。当我尝试为下一个登录用户执行此操作时,就会出现问题。对 WMP COM 的任何后续调用似乎总是返回第一个模拟用户的库,而不是当前被模拟的用户。

这是我正在做的事情的一般要点:

CoInitialize(NULL);
IWMPCore* Core = NULL;
CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER, __uuidof(IWMPCore), (void **)&Core);
IWMPMediaCollection* Collection = NULL;
Core->QueryInterface(__uuidof(WindowsMediaPlayer), (void **)&Collection);
...
//Do work
...
CoUninitialize();

【问题讨论】:

  • 发布一个 sn-p 然后 not 发布您遇到问题的代码行是毫无意义的。
  • @HansPassant 为什么投反对票?如果我知道我遇到问题的确切代码行,我就不需要发布这个问题了。如果您需要查看更多代码才能回答,为什么不直接问呢?

标签: c++ com impersonation wmp wmplib


【解决方案1】:

您确定要发布所有接口吗?

您是否尝试过调用CoFreeUnusedLibrariesEx 并检查进程资源管理器是否已卸载 WMP dll(尽管只有具有 DllCanUnloadNow 导出的 dll 才会被卸载)?

如果仍然失败,那么可能无法完全卸载 WMP,然后您可能必须为每个用户使用帮助程序/主机进程,并使用某种形式的 IPC 将数据返回到主进程中。

【讨论】:

  • 我尝试了您的建议,即致电CoFreeUnusedLibrariesEx(0, 0) 立即免费使用。不幸的是,这没有用。 :( Process Explorer 显示 WMP COM 对象总共加载了 5 个库(wmp.dll、wmpps.dll、wmploc.dll、WMVCORE.dll 和 WMASF.dll)。只有这两个库中的第一个导出了 @987654324 @函数。我不明白的是CoUninitialize应该为我卸载这些dll。但即使在调用CoUninitialize后20-30分钟左右,dll仍然存在。
  • 好的,知道了!我一步一步地检查了它,并检查了 Process Explorer 以查看它是否正在释放这些库。事实证明,我没有释放我的一个对象。我以为我都得到了它们,有些却错过了。感谢您的洞察力。
猜你喜欢
  • 2011-02-03
  • 2018-01-20
  • 2014-07-14
  • 2017-02-12
  • 2019-02-14
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多