Linker fehler bei dll mit sql anweisung



  • ich hab die Zeile kommentiert, bei die den Fehler verursacht
    (String Wert = SOQuery->FieldByName(TableName+"Ser")->AsString+SOQuery->FieldByName(String(Column))->AsString; //die Zeile ist der übeltäter, aber ich weis nicht wieso),
    bitte sagt mir wieso diese dumme Query solche Probleme bei der DLL macht?

    danke für eure Hilfe

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <windows.h>
    #include <ADODB.hpp>
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    //   Wichtiger Hinweis zur DLL-Speicherverwaltung, falls die DLL die statische
    //   Version der Laufzeitbibliothek (RTL) verwendet:
    //
    //   Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
    //   Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
    //   muß die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
    //   die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
    //   wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
    //   auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
    //   werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
    //   angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
    //   sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
    //
    //   Um die Verwendung von BORLNDMM.DLL, zu vermeiden, sollten String-Informationen als "char *" oder
    //   ShortString-Parameter weitergegeben werden.
    //
    //   Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
    //   MEMMGR.LIB nicht explizit angeben.
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    TADOQuery * __thread SOQuery;
    //---------------------------------------------------------------------------
    extern "C"
    {
      //---------------------------------------------------------------------------
      bool __declspec(dllexport) LdTable(String TableLoadString)
      {
    
        try
        {
          SOQuery->Active = false;
          SOQuery->SQL->Clear();
          SOQuery->SQL->Add(TableLoadString);
          SOQuery->ExecSQL();
          SOQuery->Active = true;
          return true;
        }
        catch(...)
        {
          return false;
        }
      }
      //---------------------------------------------------------------------------
      String __declspec(dllexport) ZelleAusgeben (String TableName, String TableLoadString, String SColumn, String SWert, String Column)
      {
        if (LdTable(TableLoadString) == true)
        {
          try
          {
            TLocateOptions Opts;
            Opts << loPartialKey;
            if (SOQuery->Locate(String(SColumn), String(SWert), Opts) == false)
              return 3;
            else
            {
              String Wert = SOQuery->FieldByName(TableName+"Ser")->AsString+SOQuery->FieldByName(String(Column))->AsString; //die Zeile ist der übeltäter, aber ich weis nicht wieso
              return Wert;
            }
          }
          catch (...)
          {
            return 2;
          }
        }
        else
          return 1;
      }
      //---------------------------------------------------------------------------
    }
    

    Edit: Code-Tags korrigiert
    -jansen



  • Bitte verrate uns unter gar keine Umständen, wie die Fehlermeldung konkret lautet!
    Wir haben nämlich solch einen Spass am Rätselraten ... 😉


  • Mod

    Hallo

    TableName ist ein string oder

    bei AnsiString wuerde ich .c_str() daran setzten 😉

    Mfg
    Klaus



  • 1. danke fürs code tag korrigieren
    2. folgendes hab ich verändert

    String SerField = TableName+"Ser";
              String Wert = SOQuery->FieldByName(SerField.c_str())->AsString+SOQuery->FieldByName(String(Column))->AsString;
              return Wert;
    

    3. es treten mit der zeile, die ich kommetiert hab folgende drei linker fehler auf:
    a)[Linker Fehler] Unresolved external '__fastcall Adodb::TADOQuery::GetSQL()' referenced from PROGRAMMPFAD\ALLFUN.OBJ
    b) [Linker Fehler] Unresolved external '__fastcall Adodb::TADOQuery::ExecSQL()' referenced from PROGRAMMPFAD\ALLFUN.OBJ
    c) [Linker Fehler] Unresolved external '__fastcall Db::TDataSet::FieldByName(const System::AnsiString)' referenced from PROGRAMMPFAD\ALLFUN.OBJ



  • KlausB schrieb:

    bei AnsiString wuerde ich .c_str() daran setzten

    Warum würdest du das tun wollen? FieldByname erwartet doch einen AnsiString als Parameter.

    Leviathan:
    Wenn du die Zeile auskommentierst läuft es? Die Locate-Funktion z.B. wird nicht bemängelt?



  • Wenn ichs soweit auskommentier wie folgt, tritt kein Fehler auf

    1. Änderung:

    try
        {
          SOQuery->Active = false;
          //SOQuery->SQL->Clear();
          //SOQuery->SQL->Add(TableLoadString);  
          //SOQuery->ExecSQL();
          SOQuery->Active = true;
          return true;
        }
        catch(...)
        {
          return false;
        }
    

    2. Änderung:
    [code]
    String SerField = TableName+"Ser";
    String Wert = "bla"; //SOQuery->FieldByName(SerField)->AsString+SOQuery->FieldByName(String(Column))->AsString;
    return Wert;



  • Das Locate akzeptiert er,
    und sorry weger dem code tag, aber irgendwie lass ich mir beim posten nicht die nötige zeit.

    Ich hoffe jemand kennt das problem und weis rat,
    Danke schon mal im Vorraus.


Log in to reply