C++ Builder XE2 Fehler ???
-
Hallo alle zusammen,
ich bin mal wieder auf ein Problem gestoßen von welchem ich denke, das es am C++ Builder XE2 liegt.
In einer Form welche mit mehreren anderen in einer zur Laufzeit dynamisch geladenen DLL liegt habe ich
2 Listboxen sowie ein Stringgrid. Aus den Listboxen können per Drag&Drop Einträge auf das Stringgrid
gezogen und dann auch auf dem Stringgrid untereinander verschoben werden. Zur Positionsbestimmung
im Stringgrid verwende ich die Methode 'MouseCoord'.void __fastcall TfrmProcessDataWeekplanDesign::sgrdWeekPlanDragDrop(TObject *Sender, TObject *Source, int X, int Y) { TStringGrid *Grid = dynamic_cast<TStringGrid*>(Sender); TListBox *LstBox = dynamic_cast<TListBox*>(cDesignDragObject->Control); UnicodeString WeekPlanItem = cDesignDragObject->GetDragItem(); TGridCoord GridCoord = Grid->MouseCoord(X, Y); int NewColumn = CalculatePlanGridColumn(Grid, GridCoord.X, X); ... ... ... }
Das ganze Grundlegende Drag&Drop habe ich noch im RAD Studio 2007 mir erarbeitet. Die Funktion des Drag&Drop an sich
ist prima. Nur gibt es beim Compilieren mit dem C++ Builder XE2 beim Beenden der Anwendung eine Zugriffsverletzung.
Wohlgemerkt nicht beim Beenden des aus der DLL gestarteten Forms, sondern nur beim Beenden der gesamten Anwendung.
Und auch das nur wenn ich im Debug-Mode compilieren. Im Release-Mode scheint alles OK zu sein.
Ich habe das DragDrop-Event Zeile um Zeile abgeklappert, und es kommt definitiv von folgender Zeile:TGridCoord GridCoord = Grid->MouseCoord(X, Y);
Hat jemand den Fehler auch schon gehabt, und/oder kennt jemand einen Ersatz für MouseCoord?
Zur Vollständigkeit hier auch noch das CodeGuard-Log das beim Ausführen ohne IDE erstellt wird
Aufgerufene Funktionen: Fehler 00001. 0x400000 (Thread 0x0A64): Exception 0xC0000005: Zugriffsverletzung bei 0x80828082. Aufrufhierarchie: 0x0CD19698(=CG32.DLL:0x01:018698) 0x0CD2783E(=CG32.DLL:0x01:02683E) 0x0CD011BF(=CG32.DLL:0x01:0001BF) 0x77C3D6B2(=ntdll.dll:0x01:03D6B2) 0x77C3D554(=ntdll.dll:0x01:03D554) 0x76E779F5(=kernel32.dll:0x01:0079F5) 0x32C9C5D8(=CC32120MT.DLL:0x01:09B5D8) 0x32C9962F(=CC32120MT.DLL:0x01:09862F) 0x32C99648(=CC32120MT.DLL:0x01:098648) 0x32C9CA78(=CC32120MT.DLL:0x01:09BA78) ------------------------------------------
und hier die Fehlermeldung beim Ausführen in der XE2 IDE
Im Projekt Organizer.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x0cd19698: read of adress 0x03913a80' aufgetreten.
Vielen Dank im Voraus, Netzschleicher
-
Über die Sache mit den Laufzeit-Packages haben wir mittlerweile schon so oft gesprochen, daß ich nicht mehr zu fragen wage; du hast das bestimmt richtig gemacht
Wenn du daraus ein selbständiges Beispielprojekt machen kannst, schau ich es mir an. Mailadresse findest du auf meiner Website, sonst via Dropbox oder so.
-
Da ich auch schon mal bei Verwendung von dynamischen DLL's solche Phänomene hatte:
Tust du den Speicher, der in der dynamischen geladenen DLL allokiert wird, auch in dieser wieder freigeben?
-
Guten Morgen,
habe Spät-/Nachtschicht, deshalb erst jetzt wieder hier.
@Burkhi
Der einzige Speicher welcher allokiert wird ist eine Drag-Image, um das gezogene
Element am Drag-Cursor anzuzeigen. Dieser wird im Destruktor des CustomDragObjects auch wieder freigegeben.
Weiteres passiert im Moment nicht. Dennoch danke für die Anregung. Sowas passiert doch oftmals allzu leicht.@audacia
Ja, wir haben das mit den Packages schon diskutiert. Das ganze Projekt ist komplett gegen die Laufzeit-Packages gelinkt.
Ich habe die Drag-Drop-Funktionalität nun mal komplett in einem kleinen Testprojekt nachgebaut. Und es lässt sich der Fehler reproduzieren. Wie gesagt, der Fehler tritt nur auf, wenn im Debug-Modus kompiliert wird. Und auch nur dann, wenn in dem Fenster wirklich eine Drag&Drop aktion vorgenommen wurde.
Wenn das Fenster nur geöffnet und wieder geschlossen wird, ist alles OK.
Ich habe Dir das Projekt mal gezippt und an Deine eMail-Adresse Deiner Homepage geschickt.Gruß Netzschleicher
-
Burkhi schrieb:
Tust du den Speicher, der in der dynamischen geladenen DLL allokiert wird, auch in dieser wieder freigeben?
Mit Laufzeitpackages und dynamischer RTL wäre das völlig legitim. Wenn es bei dir nicht geht, machst du was falsch.
Netzschleicher schrieb:
Ich habe Dir das Projekt mal gezippt und an Deine eMail-Adresse Deiner Homepage geschickt.
Ich habs bekommen und werde es mir ansehen, wenn ich wieder etwas mehr Zeit habe.
-
@audacia
Alles klar. Vielleicht findest Du ja etwas.
Es eilt auch nicht, denn ich kann ja trotzdem weitermachen. Und in 1 1/2Wochen verabschiede ich mich
sowieso erstmal für knapp 3 Wochen in den Urlaub.Auf jeden Fall schonmal Danke an dieser Stelle.
-
Ich hab es nun ausprobiert; allerdings mußte ich das Projekt auf C++Builder XE "rückportieren", da ich XE2 nicht besitze, und dabei in der Liste der Laufzeitpackages "fmx" durch" vcl;rtl" ersetzen.
Wenn ich CodeGuard in beiden Projekten deaktiviere, funktioniert alles ohne Probleme; auch nach Drag&Drop keine Zugriffsverletzung beim Beenden. Aber sobald CodeGuard aktiv ist, bekomme ich schon beim Start eine Exception bei folgendem Aufruf-Stack:
:0cd01c83 CG32.__cg_malloc + 0x67 :0cd02ce3 ; [...]\CG32.DLL :32b9a487 CC32110MT.__wexpand_wild + 0xdb :32b9c67b CC32110MT.__startupd + 0xc7 :32b012f8 ; [...]\CC32110MT.DLL
Ich vermute, daß bei mir irgendwas in der CodeGuard-Konfiguration falsch läuft, denn so schlecht hat es bei mir noch nie funktioniert. Eine beliebige VCL-Anwendung crasht mit derselben Meldung, wenn ich CodeGuard aktiviere.
Geht es denn bei dir, wenn du auf CodeGuard verzichtest?
-
Die Zugriffsverletzung tritt bei mir auch nur auf, wenn ich den CodeGuard aktiviert habe. Ist dieser ausgeschaltet, wird auch keine Zugriffsverletzung gemeldet. Bin mir deshalb auch nicht sicher ob das ein Fehler im CodeGuard ist, oder ob die 'MouseCoord'-Methode des StringGrids einen Fehler hat.
Ich werde das Testprojekt nochmals ins RAD Studio 2007 portieren und mal sehen was da herauskommt. Obwohl ich mir fast sicher bin das da alles glatt läuft, auch mit aktivem CodeGuard.
-
So, ich habe jetzt mal das Testprojekt im RAD Studio 2007 neu erstellt. Der Quellcode ist exakt der selbe als in dem C++ Builder XE2 Projekt.
Und in der mit dem RAD Studio 2007 compilierten Version treten keinerlei Fehler auf. Sowohl mit aktiviertem CodeGuard als auch ohne.
-
audacia schrieb:
Ich vermute, daß bei mir irgendwas in der CodeGuard-Konfiguration falsch läuft, denn so schlecht hat es bei mir noch nie funktioniert. Eine beliebige VCL-Anwendung crasht mit derselben Meldung, wenn ich CodeGuard aktiviere.
Mein Problem war, daß man DEP für Anwendung, die CodeGuard verwendet, deaktivieren muß, dann geht es.
Vielleicht behebt das auch dein Problem?
-
So, nun ist auch dieser Urlaub vorbei und das tolle Wetter in Deutschland hat mich wieder ...
Ich habe Deine Idee mit der DEP versucht. Aber der Fehler den der CodeGuard meldet bleibt bestehen.
Vielleicht sollte ich den C++Builder XE2 einmal in einer VM mit WinXP installieren und schauen ob dort der Fehler
auch auftritt. Dann könnte man evtl. darauf Schließen das es mit dem Win7(64bit) zusammenhängt.
-
audacia schrieb:
Mein Problem war, daß man DEP für Anwendung, die CodeGuard verwendet, deaktivieren muß, dann geht es.
Was/Wo ist DEP?
-
Kot Guardian schrieb:
audacia schrieb:
Mein Problem war, daß man DEP für Anwendung, die CodeGuard verwendet, deaktivieren muß, dann geht es.
Was/Wo ist DEP?
Du hättest einfach bei Google suchen können.
Hier steht was dazu:
http://www.winfaq.de/faq_html/Content/tip2000/onlinefaq.php?h=tip2323.htm