Проблема с COM и MSXML (только 64-разрядная версия) - PullRequest
2 голосов
/ 09 июня 2011

Мы портируем огромное приложение с 32-битного на 64-битное.В этом приложении есть несколько внешних библиотек, которые мы либо отключили, либо использовали их 64-битные версии.Мы также обращаемся к базе данных с помощью наших самостоятельно написанных методов COM.И мы использовали MSXML4, который отлично работал на 32-разрядных.

64-разрядной версии MSXML4 не существует, поэтому мы обновились до MSXML6.Мы просто используем несколько функций MSXML, особенно парсер DOM, поэтому единственное, что мы сделали, это заменили следующие строки:

#import "msxml6.dll"

и

MSXML2::IXMLDOMDocumentPtr pXMLDocPtr;
pXMLDocPtr.CreateInstance( ___uuidof( MSXML2::DOMDocument60 ) );

, затем мы попытаемся сделатькак-то так:

pXMLDocPtr->loadXML( _bstr_t( L"<?xml version=\"1.0\" encoding=\"utf-8\"?><abc></abc>" ) );

Это прекрасно работает под 32-битным.Но под 64-битным msxml6.dll выдает исключение при вызове функции loadXML.Хотя CreateInstance возвращает действительный указатель, а код возврата - S_OK.В выводе отладки также напечатано сообщение об ошибке:

First-chance exception at 0x000007fef888238e in App.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff.
Unhandled exception at 0x000007fef888238e in App.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff.

Сначала мы думали, что способ использования библиотеки неправильный, но затем мы обнаружили следующее.Если мы прочитаем наш XML-файл перед тем, как инициализировать наши собственные COM-компоненты, это сработает.Так что теперь похоже, что наши собственные компоненты COM «повреждают» библиотеку COM.Но как это вообще возможно?

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

Проблема возникает сразу после того, как мы вызываем CoCreateInstance наших COM-компонентов, что в нашем случае мало что дает.И я не вижу каких-либо очевидных ошибок на нашем COM-сервере, например, с 64-битными типами данных.

Так что вопрос:

Глючит ли 64-битная версия MSXML?

Или мы допустили фатальную ошибку с нашим 64-битным портом COM-серверов?

Кто-нибудь сталкивался с подобными проблемами?

Любая помощь будет признательна, поскольку я действительнозастрял на данный момент, потому что я не знаю, как отследить настоящую проблему.

1 Ответ

0 голосов
/ 09 июня 2011

Типичная причина этого - неожиданный вызов CoUninitialize() - он приводит к тому, что все объекты COM освобождаются и все указатели на них становятся висящими. См. Этот вопрос для примера .

...