Можно ли вызвать функцию JS из другого потока? - PullRequest
1 голос
/ 29 апреля 2011

Я пытаюсь заставить 2 разных браузера взаимодействовать друг с другом через хост с собственным кодом (C ++), используя JS window.external.

Синтаксис выглядит примерно так:

в месте назначения.js:

window.external.register("dest", eventCallbak);  
function eventCallback(senderID, data) {  
    alert("message recieved from " + senderID + " with data of " + data);  
}

на source.js:

window.external.sendMsg("source", "dest", "Hello dest! this is source...");

Мне удалось сделать это синхронно, сохранив параметр eventCallback, сохранив его как IDispatch ивызвать его, когда спросят (все в той же теме).проблем нет.

Проблемы начинаются при попытке сделать это асинхронно, что означает - сохранение eventCallback как IDispatch в одном потоке и его последующее использование в другом потоке, что приводит к сбою метода invokeс HRESULT из E_UNEXPECTED.

Есть идеи?

спасибо,

1 Ответ

2 голосов
/ 29 апреля 2011

Два экземпляра браузера используют разные экземпляры JS VM. В общем случае вы не можете взять один объект из одной виртуальной машины / кучи и передать его другой виртуальной машине / куче.

Так что вам нужно изобрести какой-нибудь маршалинг здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...