Вызов JavaScript на веб-странице из статического метода в BHO - PullRequest
1 голос
/ 28 февраля 2010

Я пишу объект Browser Helper для Internet Explorer, и мне нужно вызывать методы javascript для всех открытых экземпляров браузера из «статического» (или «глобального») метода обратного вызова.

У меня проблемы, которые, я уверен, связаны с многопоточностью в COM. Мои вопросы:

  1. Каждый браузер будет иметь свой собственный объект IWebBrowser2, на который указывает CComPtr<IWebBrowser2>. Если у меня есть статический метод обратного вызова в моем классе BHO, в какой поток поступит этот обратный вызов? Будет ли это какой-либо из потоков BHO, созданных IE?

  2. Я пытался кэшировать все указатели IWebBrowser2, созданные в каждом BHO, и обращаться к ним позже из статического метода. Тем не менее, я думаю, что есть некоторые проблемы, связанные с (не) сортировкой. Будет ли это работать? Любые предложения о хорошем / другом подходе к этому?

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

Ответ на 1 зависит от модели потоков, которую вы указываете для своего BHO. Если вы укажете ThreadingModel как Apartment, COM будет перенаправлять все вызовы вашего объекта (внутри каждого процесса iexplore.exe) в один и тот же поток. Если вы укажете ThreadingModel как Free или Both, ваш объект может быть доступен в любом потоке.

Ответ на 2 - да, это будет работать. Обычно безопасно вызывать COM-методы из любого потока, который вам нравится, потому что каждый объект объявляет свою модель потоков, когда он зарегистрирован, и сам COM отвечает за обработку любого маршаллинга, который должен произойти в результате.

Вам могут быть интересны следующие ссылки на статьи о моделях потоков COM:

0 голосов
/ 04 марта 2010

Используйте GlobalInterfaceTable для доступа к объектам между потоками.

...