Автоматизация C ++, OLE, Excel: EAccessviolation на 00000800 - PullRequest
2 голосов
/ 03 апреля 2009

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

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

Variant excel, workbooks;

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

workbooks = excel.OlePropertyGet("Workbooks");

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

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

Ответы [ 4 ]

2 голосов
/ 04 сентября 2009

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

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

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

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

1 голос
/ 03 апреля 2009

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

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

0 голосов
/ 24 июня 2013

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

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

if (dispatcher.IsBound())
{
    Variant workbooks = excel.OlePropertyGet("Workbooks");   
}
0 голосов
/ 13 января 2010

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

...