2012-08-05 2 views
0

Я имею дело с однопоточной библиотекой (не потокобезопасной), которую я хочу обернуть в COM-объект вне процесса, чтобы обойти его поток без безопасности. Мне нужно поведение, при котором каждый новый COM-объект создается в своем собственном процессе - некоторая форма одностороннего процесса без обработки.Внеочередные COM-синглеты

Прошло некоторое время с тех пор, как я имел дело с хардкорным COM, поэтому я не уверен, как подойти к этому, или это вообще возможно без каких-либо обманов.

ответ

4

Вызов CoRegisterClassObject() с аргументом REGCLS, установленным на REGCLS_SINGLEUSE. Остерегайтесь стоимости, процесс не дешевый объект операционной системы.

В противном случае нет причин, по которым вы не могли гарантировать, что вызовы с маршализированными вызовами являются потокобезопасными, просто вызовите CoInitializeEx(), чтобы запросить STA. Работает также и на внепроцессном сервере, как на встроенном сервере. Если вы делаете это только для решения проблемы с потоками, то определенно поддерживаете STA в процессе. Требуется цикл сообщений.

+0

Спасибо! Я знаю, что процессы дороги, но это единственный способ пойти с этой небезопасной библиотекой. Я понимаю требования STA, но можете ли вы объяснить, как многократные CoCreateInstance() вернут маршалированные пуайнеры для объектов в нескольких процессах? Будет ли каждый вызов порождать новый процесс? – wpfwannabe

+0

Да, REGCLS_SINGLEUSE заставляет создавать новый процесс. Избегайте предполагать, что есть что-то особенное в небезопасной библиотеке, практически все нетривиальные библиотеки небезопасны по потоку. Вот почему STA существует в первую очередь. S и T означают Single Threaded. –

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