2013-05-23 3 views
0

У меня есть одна программа потоков, которые начинаются сДолжен ли я позвонить CoInitialize в функции обратного вызова таймера

CoInitializeEx (NULL, COINIT_APARTMENTTHREADED)

я использую COINIT_APARTMENTTHREADED, потому что некоторые функции (напр. URLDownloadToFile) не работает должным образом с COINIT_MULTITHREADED в Windows XP

и теперь я изучаю странное поведение в функции обратного вызова из CreateTimerQueueTimer - COM-объекты не создавались.

Итак, должен ли я выполнять инициализацию COM в функции обратного вызова таймера или я просто что-то пропустил в своем коде?

Обновление: Я только упростить свой код, и я уверен, что я назвал CoInitializeEx до того обратного вызова таймера, но на второй функции обратного вызова таймера, похоже, я не звонил

ответ

0

CoInitialize (Ex) должен быть вызван по крайней мере, один раз за поток, за разработчика, скажем.

Если вы, как разработчик, владеете нитью (или процессом), вы должны называть ее один раз в потоке, если вы используете COM в этом потоке.

Если вы не уверены, что он был вызван до или после, потому что у вас нет нити, вы можете его назвать. Возвращаемое значение скажет вам, если вы первый, позвоните или нет. В этом случае вы также должны проверить возвращаемое значение для ужасного кода RPC_E_CHANGED_MODE, который в основном вы обречены и должны использовать свой собственный поток для того, что вам нужно делать.

И как указано в комментарии, каждый вызов CoInitialize должен быть сопряжен с CoUninitialize.

+0

Вы должны вызвать CoUninitialize перед возвратом в пул потоков. Оставьте нить так, как вы ее нашли. –

Смежные вопросы