Доброго времени суток!
Я управляю IE, который встроен в окно, используя объект IWebBrowser2.
В главном потоке приложения я создаю дочерний, в котором создаётся окно с обработчиком событий, и в котором
маршалируется IWebBrowser2:
static IStream * g_pIS;
IWebBrowser2 * pWB;
// getting pWB ...
CoMarshalInterThreadInterfaceInStream(__uuidof(IWebBrowser2), pWB, &g_pIS);
Т.е. указатель на IWebBrowser2 засовывается в stream. Через переменную g_pIS, уже в другом (главном) потоке, я безопасно получаю указатель на IWebBrowser2:
IWebBrowser2 * g_pWB;
CoGetInterfaceAndReleaseStream(g_pIS, __uuidof(IWebBrowser2), (LPVOID*)&g_pWB);
// working with g_pWB
И всё работает. Только медленно очень. Если раньше (а раньше было без маршаллинга — через очередь сообщений) процесс работы с элементам занимал 10 сек., то сейчас он занимает 70 сек. (процессорного времени).
(в 7 раз больше!)
Насколько я понял, отжерает конструкция вида (при работе с элементами документа (кол-во объектов в документе может достигать 1000 шт.):
for( long i = 0; i < allLength; ++i ) {
MSHTML::IHTMLElementPtr e = all->item( _variant_t( i ), vtMissing );
// ...
В чём же дело? Почему маршаллинг так всё тормозит?