Внепроцессные синглтоны COM

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

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


person wpfwannabe    schedule 05.08.2012    source источник


Ответы (1)


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

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

person Hans Passant    schedule 05.08.2012
comment
Спасибо! Я знаю, что процессы дороги, но это единственный способ использовать эту небезопасную библиотеку потоков. Я понимаю требования STA, но не могли бы вы рассказать, как несколько CoCreateInstance() будут возвращать упорядоченные указатели на объекты в нескольких процессах? Будет ли каждый вызов порождать новый процесс? - person wpfwannabe; 05.08.2012
comment
Да, REGCLS_SINGLEUSE принудительно создает новый процесс. Избегайте предполагать, что в библиотеке, небезопасной для потоков, есть что-то особенное, практически все нетривиальные библиотеки небезопасны для потоков. Вот почему STA существует в первую очередь. S и T означают однопоточный. - person Hans Passant; 05.08.2012