Использование COM-объектов в олицетворенном потоке

Я пишу 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?

0

Решение

Как предположил Саймон Мурье, решение проблемы с использованием STA вместо MTA.

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]