Мы портируем огромное приложение с 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-серверов?
Кто-нибудь сталкивался с подобными проблемами?
Любая помощь будет признательна, поскольку я действительнозастрял на данный момент, потому что я не знаю, как отследить настоящую проблему.