2009-04-03 8 views
2

Ich schreibe eine Hintergrunddienstanwendung, die Daten aus Excel 2003-Dateien automatisch lesen muss. Aber egal, was ich versuche, die Methode OlePropertyGet() führt immer zu einem EAccessViolation Fehler beim Versuch, von der Adresse "00000800" zu lesen.C++, OLE, Excel Automatisierung: EAccessviolation bei 00000800

Der Fehler tritt immer in der letzten Zeile dieses Codeausschnitt, und scheint unabhängig von dem, was Parameter der Methode empfängt:

Variant excel, workbooks; 

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

workbooks = excel.OlePropertyGet("Workbooks"); 

ich auf diese einige umfangreiche Google-Suche gemacht haben, aber nichts gefunden, dass selbst ist remote hilfreich, nur this Forum Thread, wo jemand das gleiche Problem hat, aber keine Informationen über die Ursache oder Lösung gibt (es ist etwas komisch, dass der Autor an einer Stelle erwähnt, er kennt die Ursache, aber nicht sagen, was es ist !).

Ich bin offen für irgendwelche Ideen, was verursacht dies und wie dieses Problem zu lösen, sondern auch alternative Ansätze zur Excel OLE-Automatisierung.

+0

Wenn Ihre Anwendung versucht, 0x800-Adresse zu lesen, dies nicht zu gut aussieht. – ALOToverflow

Antwort

2

Meine Vermutung ist, es ist eine Null-Zeiger-Ausgabe ..

Es sieht aus wie weder GetActiveOleObject() noch CreateOleObject() gearbeitet.

Überprüfen Sie die Gültigkeit von 'Excel' vor dem Aufruf OlePropertyGet.

Und ich denke, Sie sollten sicherstellen, dass Sie Excel installiert haben.

0

Ihr Code ist möglicherweise nicht in der Lage, "Excel.Application" erfolgreich aufzulösen, was zu einem Nullzeiger führt. Es verwendet eine Registrierungssuche mit dieser Zeichenfolge, um Excel zu identifizieren. Es klingt, als ob Sie diesen Registrierungseintrag vermissen.

0

Ich verwende einen solchen Code Gültigkeit der erstellten Objekte zu bestimmen (in C++ Builder):

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

if (dispatcher.IsBound()) 
{ 
    Variant workbooks = excel.OlePropertyGet("Workbooks"); 
} 
Verwandte Themen