在模拟线程中使用COM对象

时间:2013-05-11 16:54:58

标签: c++ multithreading com impersonation

我正在编写包含三个独立线程的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有什么我应该做的吗?

1 个答案:

答案 0 :(得分:0)

正如Simon Mourier建议的那样 - 使用STA代替MTA解决了这个问题。

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);