Даст ли мне маршалинг маршалированного интерфейса маршаллеру для прокси или оригинального интерфейса? - PullRequest
5 голосов
/ 26 октября 2010

Вот конкретный пример:

Я создаю интерфейс IWeBrowser2 , вызывая wb.CoCreateInstance(CLSID_InternetExplorer, 0, CLSCTX_SERVER);.Это дает мне маршалированный интерфейс из моего процесса в зависимости от того, какой из запущенных процессов iexplore.exe содержит эту вкладку браузера в моей ветке A .

Теперь я использую IGlobalInterfaceTable , чтобы получить cookie для этого интерфейса, передайте его в мой поток B и запросите оттуда маршалированный интерфейс.

Вопрос: Получу ли я прокси для прокси в моем потоке A или непосредственно для экземпляра в процессе IE?

Мне кажется разумным, что я получу прямой прокси для экземпляра с его собственной ссылкой на него,
однако :

Если я закончу свою веткуО, файл cookie, который я там создал, становится недействительным, и я больше не могу получить (и закрыть) указатели интерфейса на созданные мной веб-браузеры.Это не имеет смысла, если только в этом потоке не имеется раздела, который уничтожается при выходе из потока.

Редактировать: О, оба потока являются STA.

Ответы [ 2 ]

2 голосов
/ 20 ноября 2010

У меня наконец-то появилось время, чтобы выяснить, что происходит, поэтому я написал короткий тест, чтобы увидеть, что происходит.1006 *

Завершение потока, зарегистрировавшего интерфейс, делает куки недействительным. Уже маршалированный интерфейс остается действительным.(В данном случае это так.)

Это означает, что я получаю прокси для процесса IE вместо объекта другого потока.

1 голос
/ 26 октября 2010

У вас уже есть прокси в потоке A, поскольку вы запросили внепроцессный сервер. Что будет дальше, зависит от типа квартиры, в которой живет поток A, аргумента CoInitializeEx (). Если это MTA, вы определенно получите тот же прокси в потоке B, при условии, что это также MTA. Добавленный счетчик ссылок должен сохранять его работоспособность при выходе из потока А. Если это STA, то я не уверен на 100%, но думаю, что вы должны получить новый. Легко проверить, кстати, просто используйте один из потока A, и вы получите RPC_E_WRONGTHREAD, если потребуется создать новый.

У меня нет хорошего объяснения, почему выход из потока A убивает прокси для потока B. Если вы не вызовете IGlobalInterfaceTable :: RevokeInterfaceFromGlobal (). Что вы обычно делаете.

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