Problem mit externer DLL und exception



  • Hi

    Ich benutze eine externe DLL zum ansteuern eines 2D-Laserscanners.
    Obwohl ich beim Initiieren des Scanners alle Exceptions mit folgendem Code abfange:

    try
    	   {
    	    ret=initDll(2,57600,measCallback,errorCallback,NULL);
    	   }
    	   catch(...)
    	   {
    	    this->Terminate();
    	    m_aktStatus="Cannot init Rod4";
    	   }
    

    Kommt ab und zu folgende Fehlermeldung vom BCB5:

    Im Project project1.exe ist eine Exception der Klasse _STL::runtime_error aufgetreten....

    Was kann ich tun, das die exception abgefangen wird?

    Mfg Reinhold Fischer



  • Innerhalb der IDE werden immer alle Exception geworfen (ggf. kann man das für jede Exception ändern). Bei der Standalone Version des Programmes sollte das Fangen funktionieren



  • Danke für die Antwort, kann ich das irgendwie abschalten?

    Mfg reinhold Fischer



  • ggf. kann man das für jede Exception ändern

    Tools-> Optionen-> DEbuuger -> Native Exceptions (BCB 2006) andere Versionen analog



  • Danke nochmal 🙂

    Neues problem:

    Ich hab eine Form-Anwendung, und habe ein TThread-Objekt eingefügt, welches nur den Scanner verwaltet.

    Wenn ich jetzt einen Knopf auf der Form einbaue, bekomme ich immer den fehler, Falscher Zugriff bei Adresse ... .
    Mache ich den Button wieder weg, geht alles wieder.

    Sieht so aus als hätte der BCB5 probleme mit TThread.

    Mfg Reinhold Fischer



  • Hallo

    Wenn ich jetzt einen Knopf auf der Form einbaue, bekomme ich immer den fehler, Falscher Zugriff bei Adresse ... .
    Mache ich den Button wieder weg, geht alles wieder.

    Nur von einem einfachen TButon kommt kein solcher Fehler, sondern eher durch deinen Quellcode, den der Button ausführt.

    Sieht so aus als hätte der BCB5 probleme mit TThread.

    Nein, sondern du wendest es falsch an.

    Zu einem genauem Hinweis fehlt uns aber der Überblick über deinen Code.

    bis bald
    akari



  • Hi

    Der Fehler kommt allein, wenn ich nur einen Button einfüge, ohne Code auszuführen.

    Folgendermaßen läuft das Programm ab:

    Initialisieren von Form1
    Bei ButtonClick wird der TThread initialisiert

    try
         {
            m_Rod4Handler=new Rod4Handler(false);
         }
         catch(Exception*  e)
         {
          MessageBox(this->ClientHandle,e->Message.c_str(),"Fehler",MB_OK);
          this->Close();
         }
         Timer1->Enabled=true;
    

    In der ExecuteMethode wird zuerst der Scanner initialisiert

    if(m_CanInit)
            {
    	   //zeugs für rauschunterdrückung initialisieren
             m_Bilder=new TMessung[m_AnzBilderRauschunterdrueckung];
    	   //rod4 initialisierem
    	   InitRod4();
    	   m_CanInit=false;
    	  }
    	  m_aktStatus="Threadrunning";
    

    ExecuteMethode bleibt in einer while-Schleife

    while(m_ThreadRunning)
    	  {
    	   //hauptschleife, die immerwieder durchlaufen wird
    	   if(m_aktBildStatus==STATUS_MAKENEWBILD)
    	   {
    		//ein rauschfreies bild, aus den gesammelten erstellen
    		m_aktStatus="Neues bild wird erstellt.";
    		CreateRauschfreiesBild();
    		m_aktBildStatus=STATUS_NOTHING;
    	   }
            }
    

    CallbackMethode des Scanners speichert Informationen in einer Static-Variable
    der TThread-Klasse

    Rod4Handler::m_AnzMesspunkte=numberofpoints;
    	//Rod4Handler::m_aktStatus="Empfange Punkte";
    	if(Rod4Handler::m_aktBildStatus==STATUS_NOTHING)
    	{
    		if(Rod4Handler::m_ScanCounter<Rod4Handler::m_AnzBilderRauschunterdrueckung)
    		{
    			if(Rod4Handler::m_Bilder[Rod4Handler::m_ScanCounter].sPunkte==NULL)
    				Rod4Handler::m_Bilder[Rod4Handler::m_ScanCounter].sPunkte=new TMesspunkte[numberofpoints];
    			//bild wird nur in m_Bilder zwischengespeichert
    			for (int counter=0; counter<numberofpoints; counter++)
    			{
    				Rod4Handler::m_Bilder[Rod4Handler::m_ScanCounter].sPunkte[counter].x=points[counter].x;
    				Rod4Handler::m_Bilder[Rod4Handler::m_ScanCounter].sPunkte[counter].y=points[counter].y;
    			}
    			Rod4Handler::m_ScanCounter++;
    		}
    		else
    		{
    			Rod4Handler::m_aktBildStatus=STATUS_MAKENEWBILD;
    			Rod4Handler::m_ScanCounter=0;
    		}
    	}
    

    Form1 greift auf die Informationen zu, und stellt sie in einer PictureBoc dar

    Label1->Caption=m_Rod4Handler->GetThreadStatus();
     if(m_Rod4Handler->m_CanGetBild)
     {
    	m_AnzPoints=m_Rod4Handler->GetAnzMessPunkte();
    	if(m_Messpunkte==NULL)
    		m_Messpunkte=new TMesspunkte[m_AnzPoints];
    	m_Messpunkte=m_Rod4Handler->GetMesspunkte();
    	m_Rod4Handler->MakeNullScan();
    	DrawPoints();
     }
     if(m_Rod4Handler->m_lastError!=-1)
     {
      //MessageBox(this->ClientHandle,IntToStr(m_Rod4Handler->m_lastError).c_str(),"Fehler",MB_OK);
      Label1->Caption="Fehler"+IntToStr(m_Rod4Handler->GetLastError());
     }
    

    Ich kann das wirklich nicht nachvollziehen, ich füge nur einen Button ein,
    und es kommt ein Ausnahmefehler.

    Hoffe der Code reicht aus, wenn nicht könnte ich auch das projekt mal hochladen.
    Ich arbeite sonst nicht mit bcb5 , bin deswegen grad etwas hilflos.

    Mfg Reinhold Fischer



  • Hallo

    Nichtsdestotrotz kann ein einfaches Einfügen eines Buttons alleine keinen solchen Fehler verursachen, der eigentliche Ursprung muß in deinem Code liegen.

    Benutzt den Debugger oder selbstgeschriebene Logginfunktionen, um den Verlauf des Programms und den Inhalt der Pointer zu überprüfen, um den Fehler einzugrenzen.

    bis bald
    akari



  • Hi

    Also, der fehler wird immer komischer.

    Wenn ich die folgende 2 zeilen in der Callback-Funktion der DLL auskommentiere gehts:

    Rod4Handler::m_Bilder[Rod4Handler::m_ScanCounter].sPunkte[counter].x=points[counter].x;
                    Rod4Handler::m_Bilder[Rod4Handler::m_ScanCounter].sPunkte[counter].y=points[counter].y;
    

    also, wieder zurück auskommentiert, und mit F4 versucht, in die Funktion zu springen, klappt auch die ersten 2 mal, beim dritten mal kommt zuerst der fehler, bevor ich in die Funktion reinkomme.

    Und wenn ich bei den ersten beiden mal mit dem Debugger durchlaufen will, kommt ab einer Zeile immer nur so ein CPU-Fenster, und es geht nichtmehr im Quellcode.

    Passiert auch nur, wenn ein TButton über den Designer hinzugefügt wird. Lösche ich Button4 geht alles. Schreibe ich ihn per hand, meckert er zwar das es dazu keine Komponente gibt, aber es geht.

    Füge ich es mit dem Designer hinzu, kommt der Fehler.

    Danke, reinhold Fischer



  • Hi

    Hab den Fehler jetzt gefunden.

    Bei der Überprüfung ob

    if(Rod4Handler::m_Bilder[Rod4Handler::m_ScanCounter].sPunkte==NULL)
    

    wurde immer wnen ich eine neue Komponente eingefügt hatte FALSE zurückgeliefert, dadurch wurde kein Speicher allokiert, und deshalb die Zugriffsverletzung.

    Warum allerdings erst nach einfügen einer Komponente die Überprüfung FALSE wird, und sonst immer true ist, kann ich nicht nachvollziehen.

    Ich initialisiere sPunkte vorher überhaupt nicht, müßte es dann nicht NULL sein?
    Oder muß ich das explizit setzen?

    Mfg ReinholdFischer



  • Hallo

    Ich initialisiere sPunkte vorher überhaupt nicht, müßte es dann nicht NULL sein?

    Nein, in C++ werden nur globale Variablen automatisch initialisiert, alles andere (lokale und Member) must du selber initialisieren, je nach Typ und Zweck.

    Oder muß ich das explizit setzen?

    Ja

    Freut mich das du den Fehler selber doch recht schnell gefunden hast. Ich hoffe du hast nun mehr gelernt, als wenn dir das einfach jemand so vorgesetzt hätte. Wir hätten ja auch nur raten können.

    bis bald
    akari


Anmelden zum Antworten