Linker error, wenn ich ein TExcedlApplication einfügen und die Laufzeitpackages nicht mit einbinde.



  • HAllo
    Ich will eine TExcelapplication Anwendung in c++Builder 2006 schreiben. Wennn ich ein neue VCL-Projekt erstelle und füge dort einfach nur die TExcelapplication einfügt und starte einfach , funktioniert mein Programm.
    Gehe ich aber dann unter Project--> Optionen-->Turbo Assembler-->Packages und mache dort den Haken bei Laufzeitpackages verwenden weg und starte dann, bekomme folgenden Linker error :[Linker Fehler] Error:

    Ungelöste externe '__fastcall System::Variant::operator =(wchar_t *)'
    referenziert von C:\PROGRAM FILES (X86)\BORLAND\BDS\4.0\LIB\BCBOFFICEXP.LIB|Excel_XP_srvr.cpp

    Kann mir jemand weiterhelfen. Danke!!
    Gruss nettekov



  • Hallo an alle Profis,

    ich habe exakt das gleiche Problem.

    Hat keiner eine Idee woran das liegen kann?

    Mein Projekt hatte ich ursprünglich mal auf dem C++ Builder 6 erstellt.
    Nach dem ich es nun nach ein paar Jahren wieder reaktivieren musste und
    im BCB 2006 geladen habe, gibt es nur noch Probleme.

    Aber selbst mit einem neuen Projekt wo ich nur die TExcelApplication und
    das TExcelWorksheet einbinde, kommt dieser Fehler.

    Gruß
    Andreas



  • nettekov schrieb:

    Ungelöste externe '__fastcall System::Variant::operator =(wchar_t *)'
    referenziert von C:\PROGRAM FILES (X86)\BORLAND\BDS\4.0\LIB\BCBOFFICEXP.LIB|Excel_XP_srvr.cpp

    Das hat wohl jemand vergessen zu implementieren. Hier ist die Implementation von C++Builder 2010:

    __fastcall Variant::Variant(wchar_t* src, bool makeCopy)
      {
        SetType(varOleStr, true);
        bstrVal = makeCopy ? WideString::Copy(src) : src;
      }
    

    Das makeCopy war in C++Builder 2006 offenbar noch nicht da; stattdessen geht es wohl so:

    __fastcall Variant::Variant(wchar_t* src)
      {
        SetType(varOleStr, true);
        bstrVal = WideString::Copy(src);
      }
    


  • Hallo audacia,

    vielen Dank für deine superschnelle Antwort.

    Aber wo genau muss ich das denn jetzt eintragen? 😕



  • Gismo2007 schrieb:

    Aber wo genau muss ich das denn jetzt eintragen? 😕

    Ganz schwierige Frage.

    Was heißt es, wenn ein Symbol vom Linker nicht gefunden wird?
    Daß das Symbol in keiner der Objektdateien (die der Compiler aus deinen .cpp-Sourcen generiert) oder Bibliotheksdateien (die zur Entwicklungsumgebung gehören) enthalten war.

    Wo muß es also hin? Oder anders gefragt, wo kann es überall hin?



  • Hallo audacia,

    ich habe den Code in die CPP eingebunden.

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Verwaltung_.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma link "cspin"
    #pragma link "Excel_XP_srvr"
    #pragma resource "*.dfm"
    TfrmMain *frmMain;
    //---------------------------------------------------------------------------
    __fastcall TfrmMain::TfrmMain(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    __fastcall Variant::Variant(wchar_t* src)
      {
    	SetType(varOleStr, true);
    	bstrVal = WideString::Copy(src);
      }
    

    Das ist das Ergebnis:
    [C++ Fehler] Verwaltung_.cpp(21): E2316 '_fastcall Variant::Variant(wchar_t *)' ist kein Element von 'Variant'



  • Ich habe den Zuweisungsoperator mit dem Konstruktor verwechselt...

    In sysvari.h steht bei mir folgendes:

    #if defined(WIDECHAR_IS_WCHAR)
        Variant& __fastcall Assign(wchar_t* src, bool makeCopy);
        Variant& __fastcall operator =(wchar_t* src) {
    #if !defined(VARIANT_COPIES_BSTR)
          return Assign(src, false);
    #else
          return Assign(src, true);
    #endif
        }
    #endif
    

    Was steht da bei dir?



  • Exakt das:

    #if defined(WIDECHAR_IS_WCHAR)
        Variant& __fastcall Assign(wchar_t* src, bool makeCopy);
        Variant& __fastcall operator =(wchar_t* src) {
    #if !defined(VARIANT_COPIES_BSTR)
          return Assign(src, false);
    #else
          return Assign(src, true);
    #endif
    


  • Wenn ich nun also dein erstes Beispiel eintrage

    __fastcall Variant::Variant(wchar_t* src, bool makeCopy) 
      { 
        SetType(varOleStr, true); 
        bstrVal = makeCopy ? WideString::Copy(src) : src; 
      }
    

    dann ist so als ob sich nichts geändert hat und ich bekomme wieder

    [Linker Fehler] Error: Ungelöste externe '__fastcall System::Variant::operator =(wchar_t *)' referenziert von C:\PROGRAMME\BORLAND\BDS\4.0\LIB\BCBOFFICEXP.LIB|Excel_XP_srvr.cpp



  • Gismo2007 schrieb:

    Exakt das:

    Gut, dann definiere mal WIDECHAR_IS_WCHAR in den Projektoptionen.

    Gismo2007 schrieb:

    Wenn ich nun also dein erstes Beispiel eintrage

    ...gehts immer noch nicht, weil ich beim ersten Mal was verwechselt hatte, wie oben gesagt.



  • Hallo audacia,

    habe ich gemacht. Leider immer noch das gleiche Problem.
    Ich danke dir auf jeden Fall für deine Mühe mir bei meinem Problem zu helfen. 👍

    Was ich einfach nicht verstehe, dass der ganze Krempel ja mal einwandfrei
    funktioniert hat, wo ich noch den C++ Builder 6 hatte.
    Da ich an diesem Problem nun schon seit geraumer Zeit verzweifele,
    habe ich mich nun für eine komplett neue Lösung entschieden.

    Ich habe die Komponenten TExcelApplication und TExcelWorksheet aus dem
    Projekt gefeuert 😡 und alles über die OLE-Schnittstelle gemacht. Und siehe da, keine Probleme mehr. 😃
    Und außerdem habe ich nun die Kompatiblität zu höheren Excel-Versionen sichergestellt, was vorher nämlich auch nicht funktioniert hat.

    Jetzt haut es endlich hin.

    Gruß
    Andreas


Log in to reply