2009-05-03 6 views
3

私はclrの下でコンパイルしているコードと、単一のプロジェクトで管理されていない他のコードを持っています。C++ STDを妨害するCLR?

私のcommon.hファイルには、必要なすべてのstdライブラリヘッダーが含まれています。これは、document_manager.cpp(CLR)に含まれるmain_window.h(WinForm)に含まれるmanager.h(manager.cpp(CLRなし)の前方宣言)に含まれています。

実行時に私はあらゆる種類の奇妙な動作をしますが、1つのインスタンスではフォームがロードされません。数回デバッグするためにプログラムを一時停止すると、malloc.cのstd :: stringのメモリを再割り当てしていないことがわかりました。コードを変更することで、ostreamでSystem :: InvalidMemory(私は思う)例外を受け取ることができます。

CLRがstdライブラリの管理を停止するにはどうすればよいですか?

誰かが自分のファイルのいずれかにソースを希望する場合は、尋ねてください。

編集: コールスタックでは、フォームのロード時に実行されるマネージコードがあります。ウィンドウのinitコールバックでは、ネイティブに変換した後、マネージャクラスを持っています。その後、私は

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; 

に取得し、コールスタックは、STDを示し::のbasic_string ::いくつかの他のstd ::機能、そして最終的にはそれが永遠に立ち往生しているmalloc関数、そして、割り当てる。

編集: ファイルの書き込みにスローされる例外:

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

問題を再現するコードを投稿できますか?より具体的なエラーも役立つかもしれません。どの例外がスローされたのか、どこから例外が発生しているのかわからない場合は、デバッグするのがかなり難しくなります。 – jalf

+0

上記の情報は十分ですか?私は問題を単純に再現するのに苦労していますが、私はそれを続けます。 –

+0

なぜdownvotes?これは良い質問です。 +1 –

答えて

2

はあなたが管理対象外に滞在する必要がある機能を中心に管理する管理対象外/の#pragmaを包むの#pragmaしようとしたことがありますか? 「息をのむような熱意」の音で書かれていますが、http://www.ondotnet.com/pub/a/dotnet/2003/03/03/mcppp2.htmlには、管理コードと非管理コード/オブジェクトを混在させるためのヒントがあります。

+0

私はこれを試したが、助けにはならなかった。 –

+0

@LithMaster、アレックスの提案と私の答えを組み合わせると、ネイティブで実行したいCPPファイルをCLRで制御できなくなります。 –

0

暗闇の中でちょうど撃たれますが、STLを使用しているCPPファイルのCLRサポートをオフにしてみてください。This questionは、個々のCPPファイルに対してこれを行う方法を示しています。効果的にそれらを効果的にコンパイルします。

警告:このルートを使用すると、コンパイルしたヘッダーにネイティブにコンパイルしたCPPファイルをオフにする必要が生じることがあります。

+0

この質問を投稿する前に私はすでにこれを行っていました。私はcppファイルのCLRサポートを有効にして、私は自分の問題点を過ぎてしまった。今、CLRを有効にできないファイルであるsqlite.cに問題があります。コンパイラはC++ではなくC言語で書かれていて、C++でコンパイルするとエラーが発生します。 –

+0

私はclrサポートを有効にしたときに、私のプログラムのその部分が働いたことを明確にしました。 Document Manager.exeで 'System.AccessViolationException'の未処理の例外が発生しました 追加情報:保護されたメモリを読み書きしようとしました。これはしばしば、他のメモリが壊れていることを示します。 –

+0

うーん、それについて考えてみましょう - あなたはそれを解決することができれば幸いです! –

1

私は、あなたの記述から1つの定義ルールが当てはまるかもしれないと思います。 C++では、クラスに対して複数の定義を持たせることはできますが、それらはすべて同じでなければなりません。これにより、クラス定義をヘッダーに入れることができます。

「同一の」部分にはまだ注意が必要です。これはソースコード内のトークンだけではなく、prceprocessorの後の​​置換と(実際には)現在のコンパイラ設定が与えられた意味を意味します。明確な例としては、32/64ビットスイッチ、またはアラインメントの設定があります。これらはクラスのサイズを変更する可能性があります。

異なる場合は、MicrosoftのSTLクラスを2つ定義することができます。

+0

私はあなたが何を意味しているか完全に理解していません。私はと他のすべてのSTDライブラリを含む単一のファイルを持っており、その上に "#pragma once"があります。 –

+0

あなたはC++コンパイルルールを誤解しています。技術的には、.cppファイルをコンパイルしません。各プリプロセッサ出力( "翻訳単位")をコンパイルします。 2回含まれているヘッダーファイルは2つの異なる翻訳単位の一部であり、その中の定義は2回コンパイルされます。 – MSalters

関連する問題