-1

我有一个需要访问所有当前登录用户的 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();
4

1 回答 1

0

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

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

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

于 2012-06-16T03:14:46.553 回答