2009-05-03 12 views
3

Ich habe einige Code-Compiling unter der Clr und anderen Code, der in einem einzigen Projekt nicht verwaltet wird.CLR mit C++ STD interferieren?

Meine common.h-Datei enthält alle Header der Stammbibliothek, die ich brauche. Es wird von manager.h (forward-Deklaration für manager.cpp (no CLR)) eingeschlossen, das von main_window.h (WinForm) enthalten ist, das von document_manager.cpp (CLR) enthalten ist.

Zur Laufzeit bekomme ich alle möglichen seltsamen Verhalten, in einem Fall würde meine Form nicht geladen werden. Das Programm mehrere Male zum Debuggen anzuhalten, zeigte, dass es daran festhielt, Speicher für eine std :: string in malloc.c neu zuzuweisen. Indem ich den Code ändere, kann ich eine Ausnahme von System :: InvalidMemory (ich denke) in ostream erhalten.

Wie kann ich verhindern, dass die CLR die Std-Bibliothek verwaltet?

Wenn jemand möchte die Quelle zu meinen Dateien, fragen Sie einfach.

Bearbeiten: Im Callstack habe ich einige verwalteten Code, der ausgeführt wird, wenn mein Formular lädt. Im Fenster Init-Callback habe ich einen Übergang von managed zu nativ und dann meine Manager-Klasse. Später, ich zu

std::string error_msg; 
    error_msg = "Storage Manager: SQLite Error ("; <-- Executing Currently 
    error_msg += sqlite3_errcode(this->db_p); 
    error_msg += ") - "; 
    error_msg += sqlite3_errmsg(this->db_p); 
    *(this->log) << error_msg.c_str() << std::endl; 

und die Aufrufliste zeigt std :: basic_string :: zuweisen, dann einige andere std :: Funktionen und schließlich die malloc-Funktion, die es in ständig klemmt.

edit: Die Ausnahme, die auf das Schreiben von Dateien geworfen wird:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
    at manager.file_open(manager* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >*) 
    at DocumentManager.main_window.file_open_mainmenu_Click(Object sender, EventArgs e) in c:\development\document manager\document manager\main_window.h:line 456 
    at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e) 
    at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e) 
    at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e) 
    at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e) 
    at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met) 
    at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met) 
    at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea) 
    at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.ToolStrip.WndProc(Message& m) 
    at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
+0

Können Sie einen Code posten, der das Problem reproduziert? Einige spezifischere Fehler könnten ebenfalls hilfreich sein. Wenn Sie nicht einmal sicher sind, welche Exception ausgelöst wurde oder von wo, wird es ziemlich schwer zu debuggen. – jalf

+0

Sind die obigen Informationen gut genug? Ich habe Probleme, das Problem einfach zu reproduzieren - aber ich bleibe dran. –

+0

Warum die Downvotes? Das ist eine gute Frage. +1 –

Antwort

2

Haben Sie versucht, Einwickeln #pragma unmanaged/#pragma um die Funktionen verwaltet Sie müssen nicht verwalteten bleiben? Während in einer Art "atemloser Enthusiasmus" Ton geschrieben, hat http://www.ondotnet.com/pub/a/dotnet/2003/03/03/mcppp2.html einige Tipps zum Mischen verwalteter und nicht verwalteten Code/Objekte.

+0

Ich habe das versucht, es hat nicht geholfen. –

+0

@LithMaster, kombinieren Sie den Vorschlag von Alex mit meinen Antworten, was zu keiner CLR-Kontrolle über die CPP-Dateien führen sollte, die Sie nativ ausführen möchten. –

0

Nur ein Schuss im Dunkeln, aber versuchen Sie CLR-Unterstützung für die CPP-Dateien, die Sie verwenden, STL in. This question zeigt, wie dies für einzelne CPP-Dateien zu tun. Es kompiliert sie effektiv nativ.

Faire Warnung: Wenn Sie diese Route gehen, müssen Sie möglicherweise vorkompilierte Header die CPP-Dateien deaktivieren, die Sie nativ kompiliert haben.

+0

Ich habe das schon gemacht, bevor ich diese Frage gepostet habe. Ich habe die CLR-Unterstützung für die cpp-Dateien aktiviert und bin an meinem Problem vorbeigekommen. Jetzt habe ich Probleme mit einer Datei, für die ich CLR nicht aktivieren kann, sqlite.c. Der Compiler lässt mich nicht wie C, nicht C++, und kompiliert es als C++ gibt mir Tonnen von Fehlern. –

+0

Nur um zu klären, wenn ich CLR-Unterstützung aktiviert, dieser Teil meines Programms funktioniert. Ich erhalte eine Ausnahme: Eine nicht behandelte Ausnahme vom Typ 'System.AccessViolationException' trat in Document Manager.exe auf Weitere Informationen: Versuch, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist. –

+0

Hmmm, lass mich darüber nachdenken - ich hoffe du kannst es lösen! –

1

Ich denke, Sie könnten von der One Definition Rule getroffen werden, aus Ihrer Beschreibung. In C++ dürfen Sie mehrere Definitionen für eine Klasse haben, aber alle sollten identisch sein. Auf diese Weise können Sie Klassendefinitionen in Kopfzeilen einfügen.

Sie müssen immer noch vorsichtig mit dem "identischen" Teil sein. Dies bedeutet nicht nur die Tokens im Quellcode, sondern deren Ersetzung nach dem Prozessor und (in der Praxis) die Bedeutung dieser bei den aktuellen Compiler-Einstellungen. Ein klares Beispiel wäre der 32/64-Bit-Schalter oder die Ausrichtungseinstellung - diese könnten die Größe einer Klasse ändern.

In Ihrem Fall könnten Sie zwei Definitionen der Microsofts STL-Klassen unter verschiedenen Einstellungen haben.

+0

Ich verstehe nicht ganz, was Sie meinen. Ich habe eine einzige Datei, die , und alle anderen STD-Bibliotheken enthält, und ein "#pragma einmal" an der Spitze - ist das, was du meinst? –

+0

Sie missverstehen C++ - Kompilierungsregeln. Technisch gesehen kompilieren Sie keine .cpp-Dateien. Sie kompilieren jede Präprozessorausgabe ("Übersetzungseinheit"). Zweifach enthaltene Headerdateien sind dann Teil von zwei verschiedenen Übersetzungseinheiten, und die darin enthaltenen Definitionen werden zweimal kompiliert - möglicherweise mit unterschiedlichen Einstellungen. – MSalters

Verwandte Themen