Я пишу Windows-сервис, который состоит из трех отдельных потоков. Когда пользователь входит в систему (регистрируется при запуске службы), я олицетворяю каждый поток (поэтому он работает с теми же правами доступа, что и пользователь, вошедший в систему).
(Impersonation code without error handling)
/*Query Token */
WTSQueryUserToken(SessionId, &hUserToken)
/* Duplicate Token */
DuplicateToken(
hUserToken,
SecurityImpersonation,
&hDuplicateUserToken
)
/* Open Thread handle */
hThreadHandle = OpenThread(
THREAD_IMPERSONATE |
THREAD_QUERY_INFORMATION |
THREAD_SET_THREAD_TOKEN,
TRUE,
threadID
);
/* Assign the impersonation token to the thread */
SetThreadToken(&hThreadHandle, hDuplicateUserToken)
Позже в той же теме я использую объект COM (фабрика изображений) для извлечения миниатюр для изображений (использование многих доступных API дает похожие результаты)
/* com initialization */
CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);
/* piece of code to retrieve a thumbnail */
hr = pImageFactory->GetImage(size, SIIGBF_BIGGERSIZEOK, &thumbNail);
Когда код для извлечения миниатюры вызывается из не олицетворенного потока или обычного настольного приложения, я получаю эскизы как для изображений, так и для видео.
Когда код вызывается из олицетворенного потока, единственное, что я получаю, это один значок для всех изображений или не реализованный hresult (для провайдера IThumbnail).
Что-нибудь, что я должен сделать с олицетворенным потоком перед вызовом COM API?
Как предположил Саймон Мурье, решение проблемы с использованием STA вместо MTA.
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
Других решений пока нет …