2009-05-03 11 views
3

Je compile du code sous le code clr et d'autres codes non gérés dans un seul projet.CLR interférant avec C++ STD?

Mon fichier common.h contient tous les en-têtes de bibliothèque std dont j'ai besoin. Il est inclus par manager.h (déclaration forward pour manager.cpp (no CLR)), qui est inclus par main_window.h (WinForm) qui est inclus par document_manager.cpp (CLR).

Lors de l'exécution, j'obtiens toutes sortes de comportements bizarres, dans un cas, mon formulaire ne se chargerait pas. La suspension du programme de débogage à plusieurs reprises a montré qu'il était bloqué en réaffectant la mémoire pour une chaîne std :: dans malloc.c. En changeant le code, je peux recevoir une exception System :: InvalidMemory (je pense) dans ostream. Comment puis-je empêcher le CLR de gérer la bibliothèque std?

Si quelqu'un veut la source de l'un de mes fichiers, il suffit de demander.

Modifier: Dans la pile d'appel, j'ai un code managé qui s'exécute lorsque mon formulaire se charge. Dans le rappel de la fenêtre init, j'ai une transition native gérée, puis ma classe de gestionnaire. Plus tard, je peux

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; 

et callstack montre std :: basic_string :: assigner, puis d'autres std :: fonctions, et enfin la fonction malloc, qui est perpétuellement coincé dans.

edit: L'exception qui est levée sur l'écriture du fichier:

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

Pouvez-vous poster du code qui reproduit le problème? Certaines erreurs plus spécifiques peuvent également être utiles. Si vous n'êtes même pas sûr de savoir quelle exception a été lancée, ou d'où, il devient très difficile de déboguer. – jalf

+0

L'information ci-dessus est-elle suffisante? J'ai de la difficulté à reproduire le problème simplement - mais je vais continuer. –

+0

Pourquoi les downvotes? C'est une bonne question. +1 –

Répondre

2

Avez-vous essayé emballage #pragma non géré/#pragma géré autour des fonctions dont vous avez besoin pour rester non géré? Bien qu'il soit écrit dans une sorte de ton "enthousiasme sans souffle", http://www.ondotnet.com/pub/a/dotnet/2003/03/03/mcppp2.html a quelques conseils sur le mélange de code/objets gérés et non gérés.

+0

J'ai essayé, ça n'a pas aidé. –

+0

@LithMaster, combinez la suggestion d'Alex avec mes réponses, ce qui ne devrait pas entraîner de contrôle CLR sur les fichiers CPP que vous voulez exécuter en mode natif. –

0

Juste une chance dans le noir, mais essayez de désactiver la prise en charge CLR pour les fichiers CPP que vous utilisez STL. This question montre comment faire cela pour les fichiers CPP individuels. Il les compile efficacement nativement. Avertissement correct: si vous suivez cette route, vous devrez peut-être désactiver les en-têtes précompilés les fichiers CPP que vous avez compilés en mode natif.

+0

Je l'ai déjà fait avant de poster cette question. J'ai activé le support CLR pour les fichiers cpp, et j'ai passé mon problème. Maintenant, j'ai des problèmes avec un fichier pour lequel je ne peux pas activer CLR, sqlite.c. Le compilateur ne me laisse pas car c'est C, pas C++, et le compiler comme C++ me donne des tonnes d'erreurs. –

+0

Juste pour clarifier, quand j'ai activé le support clr, cette partie de mon programme a fonctionné. Je reçois une exception: Une exception non gérée de type 'System.AccessViolationException' s'est produite dans Document Manager.exe Informations supplémentaires: Vous avez tenté de lire ou d'écrire de la mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue. –

+0

Hmmm, laissez-moi y réfléchir - j'espère que vous pourrez le résoudre! –

1

Je pense que vous pourriez être frappé par la règle de définition unique, à partir de votre description. En C++, vous pouvez avoir plusieurs définitions pour une classe, mais elles doivent toutes être identiques. Cela vous permet de mettre des définitions de classe dans les en-têtes.

Vous devez encore faire attention avec la partie "identique". Cela ne signifie pas seulement les jetons dans le code source, mais leur remplacement après le prceprocessor et (en pratique) la signification de ceux-ci étant donné les paramètres du compilateur en cours. Un exemple clair serait le commutateur 32/64 bits, ou le paramètre d'alignement - ceux qui pourraient changer la taille d'une classe.

Dans votre cas, vous pouvez avoir deux définitions des classes STL de Microsoft, sous différents paramètres.

+0

Je ne comprends pas très bien ce que vous voulez dire. J'ai un seul fichier qui comprend , et toutes les autres bibliothèques STD, et un "#pragma une fois" en haut de celui-ci - est-ce que vous voulez dire? –

+0

Vous ne comprenez pas les règles de compilation C++. Techniquement, vous ne compilez pas les fichiers .cpp. Vous compilez chaque sortie du préprocesseur ("unité de traduction"). Les fichiers d'en-tête inclus deux fois font alors partie de deux unités de traduction différentes, et les définitions qui y figurent sont compilées deux fois, éventuellement avec des paramètres différents. – MSalters