2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
|
||||||||||||||||
1 | ||||||||||||||||
Использование функций CoInitialize и CoUnitialize в контексте глобальных параметров28.08.2015, 16:24. Показов 7472. Ответов 8
Метки нет (Все метки)
Привет,
Интересует вопрос использования функций (CoInitialize и CoUnitialize) в контексте инициализации и уничтожения глобальных объектов COM. Например, есть набор параметров, которые извлекаются в глобальные переменные до момента завершения приложения. Пара (CoInitialize и CoUnitialize) необходима для инициализации COM объектов, но когда есть промежуточные функции, которые используют те же глобальные объекты COM, не получается ли так, что использование данной пары лишним? Вот так выглядит код: plugin.h
2. Если все же необходимо использовать пару (CoInitialize и CoUnitialize), то возможно использовать такую конструкцию:
Спасибо
1
|
28.08.2015, 16:24 | |
Ответы с готовыми решениями:
8
Задача на использование функций в качестве параметров других функций Объявление глобальных в контексте приложения переменных Использование функций в качестве формальных параметров С++ Использование функций как параметров процедур |
Ушел с форума
|
|
28.08.2015, 20:45 | 2 |
Сообщение было отмечено Vite как решение
Решение
Во-первых, CoInitialize/Uninitialize работают по принципу подсчета ссылок:
X раз вызвали init, X раз нужно вызвать uninit. Главное, чтобы аргументы вызова всегда были одинаковыми. Во-вторых, COM-объекты без CoInitialize использовать вообще нельзя, так что сомнения беспочвенны. Ну и в-третьих, если глобальные объекты находятся в dll и им нужна COM-инициализация - это уже очень плохо.
0
|
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
|
|
28.08.2015, 21:32 [ТС] | 3 |
То есть, для каждой функции, где вызываются объекты COM нужно использовать пару (CoInitialize/Uninitialize).
Спасибо за поддержку
0
|
Ушел с форума
|
|
28.08.2015, 21:49 | 4 |
Правильнее не для функции, а для потока.
Один поток, использующий COM - одна пара CoInitialize/CoUninitialize.
0
|
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
|
|
28.08.2015, 22:11 [ТС] | 5 |
Значит мое предположение верно, использовать CoInitialize при запуске приложения, и CoUninitialize перед завершением. Если я ошибаюсь, поправьте меня.
0
|
Ушел с форума
|
|
28.08.2015, 22:31 | 6 |
CoInitialize(Ex)/OleInitialize должен быть вызван в каждом потоке
перед тем, как поток будет работать с COM. Вот основное правило. Если у тебя двадцать потоков и каждый где-то делает CoCreateInstance и т.п., то каждый из них должен звать CoInitialize(Ex).
2
|
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
|
||||||
28.08.2015, 22:46 [ТС] | 7 | |||||
Ну, мне пока рановато до распределенных систем. Все происходит в едином процессе приложения, по этому я решил оптимизировать код, используя пару (CoInitialize/CoUninitialize) в специальных функциях SDK приложения.
Вот только один момент до конца не понятен, если создается глобальный объект в заголовке, например:
0
|
Ушел с форума
|
||||||
28.08.2015, 22:53 | 8 | |||||
Vite, ну при чем здесь распределенные системы ?
Вот смотри, приведу пример, может так нагляднее будет:
0
|
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
|
|
28.08.2015, 23:22 [ТС] | 9 |
В моем случае, объекты COM инициализированы только в функциях (SDK) приложения. Практически все функции SDK использую параметр SessionId, который определен в глобальной переменной. То есть на момент старта приложения, вызывается функция OnAppStartAfter, в которой определяется параметр SessionId, и он неизменный до завершения приложения. В этом смысле, как я понимаю, поток единый.
0
|
28.08.2015, 23:22 | |
28.08.2015, 23:22 | |
Помогаю со студенческими работами здесь
9
Использование значений, заданных по умолчанию для параметров функций Обработать одномерный массив с использование процедур и функций без параметров и с параметрами Обработать одномерный массив с использование процедур и функций без параметров и с параметрами Потокозащищенность глобальных функций .NET Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |