ExcelMappe öffnen -> falscher Variablentyp
-
Hallo,
nach der Umstellung auf den CBuilder 10.3.3 habe ich das Problem, dass sich meine Excelmappe nicht mehr öffnet. Das mache ich wie folgt:
bool __fastcall TFMain::BookOpen(AnsiString &BookName) { try { m_vWorkbooks_00 = m_vExcel.OlePropertyGet("Workbooks").OlePropertyGet("Open", BookName.c_str()); return true; } catch(...)
Jetzt erhalte ich diesen Fehler:
Erste Gelegenheit für Exception bei $7508B152. Exception-Klasse EOleSysError mit Meldung 'Falscher Variablentyp'. Prozess nnnnnnnn.exe (7648)
Die Variable m_Workbooks_00 ist als Variant deklariert.
Danke und Gruß
Torsten
-
Unterteil den Aufruf mal in seine Einzelteile, dann siehste wenigstens, was kaputtgeht:
auto wb1 = m_vExcel.OlePropertyGet( "Workbooks" ); auto wb2 = wb1.OlePropertyGet( "Open", BookName.c_str() );
-
Hier knallts:
auto wb2 = wb1.OlePropertyGet( "Open", BookName.c_str() );
-
Benutz´ statt des AnsiString mal WideString. COM arbeitet oft mit BSTR zusammen, in Delphi ist der zugehörige Stringtyp WideString.
WideString ws = BookName; auto wb1 = m_vExcel.OlePropertyGet( "Workbooks" ); auto wb2 = wb1.OlePropertyGet( "Open", ws.c_str() );
-
Ist
WideString
wirklichBSTR
-kompatibel?
(Ein korrekterBSTR
hat vor dem erstenwchar_t
auf das der Zeiger zeigt noch ein Wort mit der String-Länge stehen. D.h. einBSTR
kann zwar alswchar_t*
verwendet werden, aber ein normalerwchar_t*
ist kein gültigerBSTR
.)
-
Jau, isser.
Delphi Stringtypen. Jedenfalls laut Embarcadero Wiki. Obwohl... muss nix heißen bei den Pfosten.
-
So, das ist es:
auto wb2 = wb1.OlePropertyGet( "Open", ws );
Wobei ws nicht .c_str() sein darf. Jetzt funktioniert es.
VIELEN Dank
Torsten
-
Ups, da geht es doch noch weiter. Den gleichen Fehler erhalte ich auch hier:
int emaxLine = ReadLastCell(m_vWorkbooks_00, "Sheet0");
-
Wie oben schon erwähnt arbeitet COM mit BSTR als Stringdatentyp. Ersetz´ "Sheet0" mal durch einen WideString.
-
Ok, habe es so versucht:
WideString sh = "Sheet0"; emaxLine = ReadLastCell(m_vWorkbooks_00, sh);
Erhalte aber das hier:
[bcc32c Fehler] UnMain.cpp(170): no viable conversion from 'System::WideString' to 'char *'
-
ReadLastCell
wird wohl eine eigene Funktion (von dir) sein, welche intern den Parameter weiterreicht, d.h. du mußt den Typ dieses Funktionsparameters ändern.Dir scheinen einige Grundlagen bzgl. ANSI und Unicode (Widestring) zu fehlen (insb. der Umsetzung in eigenem Code), wenn ich auch deine anderen Themen hier so lese?
Edit: s. z.B. Unicode in RAD Studio
-
@Th69 sagte in ExcelMappe öffnen -> falscher Variablentyp:
ReadLastCell
wird wohl eine eigene Funktion (von dir) sein...Das sind keine Funktionen die ich selbst erstellt habe. Diese hatte ich vor ca. 15 Jahren von dieser Seite: BytesAndMore. Hat bis jetzt immer gut funktioniert.
Dir scheinen einige Grundlagen bzgl. ANSI und Unicode (Widestring) zu fehlen (insb. der Umsetzung in eigenem Code), wenn ich auch deine anderen Themen hier so lese?
Das mag wohl sein. Hast du denn da für mich eine gute Lektüre, die ich mir dazu anschauen kann?
Ich habe nun in einigen Funktionen das
char*
durch
WideString
ersetzt. Nun läuft es wieder.
Danke euch...
PS: Habe den Link jetzt aufgerufen. Lese mir das mal durch um es zu verstehen. Danke dir