Funktion in DLL die vectoren und StirngLists als Parameter hat, wie geht das?



  • hallo,

    ich habe folgende funktion in meiner dll:

    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    __declspec(dllexport)void FindAreas(TStringList* VDAList,std::vector<int>* startStopPositions,
                                    std::vector<std::pair<int,int> >*startStopVector) throw (String)
    
    {
       int start, stop;
       int searchLen = VDAList->Count;
       int areacounter;
    
       for(unsigned int i = 0;i < searchLen; ++i)
          {
            if(VDAList->Strings[i].SubString(0,3)=="512")
               {
                areacounter++;
                startStopPositions.push_back(i);  //Anfang von neuem 512 Block
               }
          }
    
       if(areacounter!=startStopPositions.size()) //wenn meher "startpositioen als areale
          {
            throw String("Synchronisationsfehler");
          }
    
       for(unsigned int i = 0;i < areacounter; ++i)
          {
            start = startStopPositions.at(i);
    
            //sind wir am letzten startpunkt angekommen?
            //wenn ja ist das ende der datei die letzte zeile
            //sonst ist das ende des einen blockes der anfang des nächsten -1
            if(i+1 >= areacounter)
               stop = searchLen;
            else
               stop = startStopPositions.at(i+1);     //hier ende ist der anfang des neuen
    
            //ist i nicht wirklich das ende der datei, muss die stopposition um
            //1 nach vorn gelegt werden, da sonst der anfang der nächsten area
            //das ende des vorhergehenden wäre
            if(i!=areacounter-1)
             --stop;
    
             //nun füllen wir den vector mit den anfang und endwertden der bereiche
             startStopVector.push_back(std::make_pair(start,stop));
          }
    }
    

    da diese funktionen diese vectoren direkt verändert, habe ich sie als zeiger übergeben....damit änderungen auch im aufrufenden programm stattfinden!

    dieses sieht so aus:

    .h

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Dialogs.hpp>
    #include <Menus.hpp>
    #include <vector>
    #include <utility>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TOpenDialog *OpenDialog1;
            TMainMenu *MainMenu1;
            TMenuItem *Datei1;
            TMenuItem *ffnen1;
            TMemo *Memo1;
            void __fastcall ffnen1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
            std::vector<int> stStopPositions;
            std::vector<std::pair<int,int> > stStopVector;
            TStringList* VDALIST;
    };
    
    __declspec(dllimport)void FindAreas(TStringList* VDAList,std::vector<int>* startStopPositions,
                                    std::vector<std::pair<int,int> >* startStopVector);
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    .cpp

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ffnen1Click(TObject *Sender)
    {
      if(OpenDialog1->Execute())
       {
          Memo1->Lines->Clear();
          delete VDALIST;
          VDALIST = 0;
          VDALIST = new TStringList();
          stStopVector.clear();
          stStopPositions.clear();
          FindAreas(VDALIST,&stStopPositions,&stStopVector);
          for(int i = 0;i < stStopVector.size(); ++i)
             {
               Memo1->Lines->Add("Bereiche: " + String(stStopPositions.size()));
               Memo1->Lines->Add("Start Bereich #" + String(i) + String (stStopVector.at(i).first)
                                    + " Stop Bereich #" + String(i) + String(stStopVector.at(i).second));
             }
       }
    }
    //---------------------------------------------
    

    jedoch bekomme ich folgenden fehelr:

    [Linker Fehler] Unresolved external 'FindAreas(Classes::TStringList *, _STL::vector<int, _STL::allocator<int> > *, _STL::vector<_STL::pair<int, int>, _STL::allocator<_STL::pair<int, int> > > *)' referenced from D:\VDA_REMAKE\FUNKTION_IN_DLL\UNIT1.OBJ
    

    wie übergbe ich diese vectoren richtig??



  • habe es aus spaß mal auf referenzen umgestellt, nun kann ich es linken, bekomme aber bei der benutzung der funktion, eine Externe Exception!

    wieso bzw.. wie kann ich erkennen was da schief geht?

    oder mache ich grundsätzlich was falsch??



  • Hallo,

    Laß doch mal die Exceptionspezifikation beim Export weg. Vielleicht hilft das ja. Hast du die dll statische eingebunden und auch die Importbibliothekt zum Projekt hinzugefügt?
    Bei Übergabe von VCL-Objekten und insbesonder bei STL-Klassen mußt du aufpassen, dass du deine Dlls und die Projekte die sie verwenden mit der gleichen BCBVersion kompiliert wurden. BCB5, BCB6 und BDS verwenden jeweils unterschiedliche STL-Bibliotheken.



  • also ist statisch und die lib ist drin!

    mit dem exception versuch ich morgen!

    hoffentlich klappt das!



  • also ich habe die excpetion-spezialisierung weggenommen!

    geht jetzt (linken und so)

    aber beim benutzen bekomm ich eine externe exception!

    woran könnte das liegen?



  • whabe mal geschaut wo ungefähr der fehler auftritt, habe das im code mit "------>>>>>>" markiert

    __declspec(dllexport)void FindAreas(TStringList* VDAList,std::vector<int>* startStopPositions,
                                    std::vector<std::pair<int,int> >* startStopVector)
    
    {
       int start, stop;
       int searchLen = VDAList->Count;
       int areacounter;
    
       for(unsigned int i = 0;i < searchLen; ++i)
          {
            if(VDAList->Strings[i].SubString(0,3)=="512")
               {
                areacounter++;
                startStopPositions->push_back(i);  //Anfang von neuem 512 Block
               }
          }
    
       if(areacounter!=startStopPositions->size()) //wenn meher "startpositioen als areale
          {
            //throw String("Synchronisationsfehler");                   //--------->>>>>>er geht bis hier hin, und bringt dann die Exception (auch wenn es auskommentiert ist)
    //davor ist er noch in die __vector.h gesprungen, sonst nirgends hin
          }                                             */
    
       for(unsigned int i = 0;i < areacounter; ++i)
          {
            start = startStopPositions->at(i);
    
            //sind wir am letzten startpunkt angekommen?
            //wenn ja ist das ende der datei die letzte zeile
            //sonst ist das ende des einen blockes der anfang des nächsten -1
            if(i+1 >= areacounter)
               stop = searchLen;
            else
               stop = startStopPositions->at(i+1);     //hier ende ist der anfang des neuen
    
            //ist i nicht wirklich das ende der datei, muss die stopposition um
            //1 nach vorn gelegt werden, da sonst der anfang der nächsten area
            //das ende des vorhergehenden wäre
            if(i!=areacounter-1)
             --stop;
    
             //nun füllen wir den vector mit den anfang und endwertden der bereiche
             startStopVector->push_back(std::make_pair(start,stop));
          }
    }
    


  • ok, hab mal den gesamten funktionsrumpf auskommentiert, selbst da tritt fehler auf!

    hm...weis nicht mehr so richtig weiter



  • hm...habe das mal alles in kleine funktionen aufgeteilt, da scheint es zu funktionieren, auch mit den stl und vcl komponenten!


Anmelden zum Antworten