WMP COM не работает при последующих олицетворениях пользователей
У меня есть служба Windows, которая нуждается в доступе к библиотекам проигрывателя Windows Media всех пользователей, вошедших в систему. Поскольку это сервис, я должен выдать себя за зарегистрированного пользователя, чтобы при вызовах к 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();
1 ответ
Вы уверены, что выпускаете все интерфейсы?
Вы пытались вызвать CoFreeUnusedLibrariesEx и проверить в Process Explorer, выгружены ли DLL-файлы WMP (хотя выгружаются только dll с экспортом DllCanUnloadNow)?
Если по-прежнему происходит сбой, возможно, WMP не может быть полностью выгружен, и тогда вам, возможно, придется использовать вспомогательный / хост-процесс для каждого пользователя и вернуть данные в основной процесс с помощью какой-либо формы IPC.