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 wirklich BSTR-kompatibel?
    (Ein korrekter BSTR hat vor dem ersten wchar_t auf das der Zeiger zeigt noch ein Wort mit der String-Länge stehen. D.h. ein BSTR kann zwar als wchar_t* verwendet werden, aber ein normaler wchar_t* ist kein gültiger BSTR.)



  • 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


Log in to reply