C++, OLE, автоматизация Excel: EAccessviolation по адресу 00000800

Я пишу приложение фоновой службы, которое должно автоматически считывать данные из файлов Excel 2003. Но что бы я ни пытался, метод OlePropertyGet() всегда приводит к ошибке EAccessViolation при попытке чтения с адреса «00000800».

Ошибка всегда возникает в последней строке этого фрагмента кода и не зависит от того, какой параметр получает метод:

Variant excel, workbooks;

try
{
    excel = GetActiveOleObject("Excel.Application");
}
catch(...)
{
    excel = CreateOleObject("Excel.Application");
}

workbooks = excel.OlePropertyGet("Workbooks");

Я провёл обширный поиск в Google по этому вопросу, но не нашёл ничего даже отдаленно полезного, только эта ветка форума, в которой кто-то сталкивается с такой же проблемой, но не дает никакой информации о причине или решении (довольно забавно, что в какой-то момент автор упоминает, что знает причину, но не говорит, что это такое!).

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


person Community    schedule 03.04.2009    source источник
comment
Если ваше приложение пытается прочитать адрес 0x800, это выглядит не очень хорошо.   -  person ALOToverflow    schedule 15.01.2010


Ответы (4)


Я предполагаю, что это проблема с нулевым указателем.

Похоже, ни GetActiveOleObject(), ни CreateOleObject() не сработали.

Попробуйте проверить действительность «excel» перед вызовом OlePropertyGet.

И я думаю, вы должны убедиться, что у вас установлен Excel.

person ShoeLace    schedule 04.09.2009

Вы можете использовать инструменты Visual Studio для Office (см. http://msdn.microsoft.com/en-us/library/d2tx7z6d.aspx).

Или вы можете использовать поддержку ATL для создания экземпляра объектной модели, предоставляемой офисом.

person Cătălin Pitiș    schedule 03.04.2009

Возможно, ваш код не сможет успешно разрешить «Excel.Application», что приведет к нулевому указателю. Он использует поиск в реестре с этой строкой для идентификации Excel. Похоже, вам не хватает этой записи в реестре.

person Greg    schedule 13.01.2010

Я использую такой код для определения правильности созданных объектов (в С++ Builder):

Varaint excel = GetActiveOleObject("Excel.Application");
TAutoDriver<IDispatch> dispatcher;
dispatcher.Bind(excel, false);

if (dispatcher.IsBound())
{
    Variant workbooks = excel.OlePropertyGet("Workbooks");   
}
person skondratov    schedule 24.06.2013