2009-04-03 2 views
2

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

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

Variant excel, workbooks; 

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

workbooks = excel.OlePropertyGet("Workbooks"); 

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

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

+0

Если приложение пытается читать 0x800 адрес, это не выглядит слишком хорошо. – ALOToverflow

ответ

1

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

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

2

Моя догадка является пустой указатель вопрос ..

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

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

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

0

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

0

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

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

if (dispatcher.IsBound()) 
{ 
    Variant workbooks = excel.OlePropertyGet("Workbooks"); 
} 
Смежные вопросы