CoInitialize Failed - PullRequest
       5

CoInitialize Failed

1 голос
/ 05 февраля 2010

У нас было многопоточное приложение. Каждый поток должен вызываться с CoIntialize, когда он инициализируется, поскольку мы используем некоторый C ++ COM-объект для нашей операции с БД. Приложение работает нормально в течение длительного времени в производственной среде. Но неожиданно API CoIntialize () в функции инициализации потока завершился с ошибкой ниже ThreadInit; HRESULT: 80070008: недостаточно места для обработки этой команды. ОС: Windows Server 2003 R2 с пакетом обновления 2. Я нашел работу вокруг в stackoverflow увеличить размер кучи для консольного приложения с 512 КБ до 1 МБ в реестре Windows. Я могу сделать это. Но я хочу знать, какова возможная причина, чтобы это произошло в первую очередь. Конверт не изменился в последнее время. На этой машине запущено несколько других процессов, которые они могут вызывать Coinitialize без каких-либо проблем. Это не удалось только для двух процессов. Заранее спасибо

Ответы [ 3 ]

1 голос
/ 05 февраля 2010

Что-то где-то протекает. Начните с предположения, что это ваша программа. Вы можете наблюдать за использованием его дескриптора с помощью Taskmgr.exe, вкладки «Процессы», столбцов «Просмотр + выбор» и отметки «Дескрипторы», объектов GDI и объектов USER. Соблюдайте эти цифры, пока ваше приложение работает. Если они стабильно лезут, значит, в вашем коде есть утечки. Шоу заканчивается, когда колонка достигает 10000.

Более неясное объяснение - нехватка места в пуле памяти ядра. Также отображается в Taskmgr на вкладке «Производительность».

1 голос
/ 05 февраля 2010

CoInitialize"инициализирует библиотеку COM в текущем потоке", которая требует памяти.

Я предполагаю, что ваша производственная среда достигла точки, когда размер кучи приложения был недостаточен для инициализации COM в новом потоке. Возможно, вы попали в сценарий, в котором вы выделили больше потоков, чем раньше, даже если приложение не выполнялось так долго.

Увеличение размера кучи исправило бы это, поскольку это позволило бы правильно инициализировать эти потоки.

0 голосов
/ 06 февраля 2010

Есть ли шанс, что вы позвоните CoInitialize из DllMain, тем более, на DLL_THREAD_ATTACH? Это, скорее всего, приведет к тупику или утечкам.

Я полагаю, утечка памяти происходит где-то около индекса Thread Local Storage

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