У меня проблема со старым программным обеспечением (начало 2000 года), написанным на C ++, которое использует Excel для обработки данных. В предыдущих версиях Excel он работал нормально, но с версии 2013 я получаю сбой, которого раньше не видел.
Мы создали собственную надстройку COM для Excel, эта надстройка зарегистрирована в regsvr32 и доступна в Excel 2013. Сначала надстройка отказалась работать, но ее отключило отключение Data Execution Prevention (DEP).
Доступ к этой надстройке осуществляется путем создания экземпляра Excel в коде:
_Application.CreateDispatch ("Excel.Application");
После создания экземпляра Excel мы получаем загруженные надстройки из экземпляра и находим нашу надстройку, просматривая надстройки COM.
_Application.GetCOMAddIns();
Как только мы получили нашу надстройку, мы можем отправлять команды через интерфейс:
IExcelServer* server = excel.GetServerAddIn(); // Obtain the server COM-AddIn.
HRESULT result = server->Execute (&req, &rep, &retval);
Одна из команд, которую мы можем отправить здесь, — это запрос значения из Excel на основе заданной строковой метки (метка будет находиться в столбце A, и эта функция возвращает значение в столбце B в той же строке). Теперь код вылетает в следующей строке кода:
rng.Find (COleVariant (label), CovOptional, CovOptional, COleVariant (xlWhole), CovOptional, xlSearchNext, CovOptional, CovOptional, CovOptional);
Объект ‘rng’ имеет тип Range и относится к правильному листу, а диапазон варьируется от A1 до A17. Когда мы получаем значение из объекта ‘rng’ (rng.GetValue2 ()), оно дает нам следующий массив (который содержит значение, указанное в аргументе метки):
safearray из VARIANT = [1,17] (Пусто, Пусто, BSTR = 0x160bc6bc «Сеть», Пусто, Пусто, Пусто, Пусто, BSTR = 0x0bbca5cc «Pre», BSTR = 0x15f499fc «WebStart», BSTR = 0x0bbca48c «WebMid», BSTR = 0x0bbca5a4 «WebEnd», BSTR = 0x160bc80c «Post», пусто, пусто, BSTR = 0x15f49a24 «SafeStartWeb», BSTR = 0x15f49a4c «SafeEndWeb», пусто)
Мы получаем следующую ошибку при отладке:
«Необработанное исключение в 0x00ccbb4A в Excel.exe: 0xC0000005: расположение чтения нарушения доступа 0x00000000».
Мы также видим следующее сообщение в средстве просмотра событий Windows каждый раз, когда происходит сбой Excel:
«Описание для идентификатора события 0 из источника MSOIDSVC.EXE не может быть найдено. Либо компонент, который вызывает это событие, не установлен на локальном компьютере, либо установка повреждена. Вы можете установить или восстановить компонент на локальном компьютере.
Если событие возникло на другом компьютере, отображаемая информация должна была быть сохранена вместе с событием.
Следующая информация была включена в мероприятие:
Ошибка InitializeSvcAPI с hr = 0x8004888d «
Код сделан в VS2010 с использованием C ++ и работает под управлением Windows7 x64. Мы также протестировали код на компьютере с Windows 8 x64, но получили тот же результат.
Кто-нибудь видел этот сбой раньше или может посоветовать, как это исправить?
Заранее спасибо.
Задача ещё не решена.