2009-05-03 3 views
3

나는 하나의 프로젝트에서 관리되지 않는 다른 코드와 clr하에 컴파일 된 코드를 가지고있다.C++ STD를 방해하는 CLR?

내 common.h 파일에는 필요한 모든 표준 라이브러리 헤더가 포함되어 있습니다. document_manager.cpp (CLR)에 포함 된 main_window.h (WinForm)에 포함 된 manager.h (manager.cpp (CLR 없음)에 대한 전달 선언)에 포함됩니다.

런타임에 나는 모든 종류의 이상한 행동을 취합니다. 한 가지 경우에는 양식이로드되지 않습니다. 여러 번 디버깅을 위해 프로그램을 일시 중지하면 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; 

에 도착하고 호출 스택은 표준 : : basic_string :: 할당 한 후 다른 표준 : 기능, 그것은에서 끊임없이 붙어있다 마지막으로 malloc에 ​​기능을 보여줍니다.

편집 : 파일 쓰기에 throw되는 예외 :

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, 내 답변과 함께 Alex의 제안을 결합하면 네이티브로 실행하려는 CPP 파일을 CLR 제어 할 수 없습니다. –

0

어두운 곳에서 방금 촬영했지만 STL을 사용하는 CPP 파일에 대한 CLR 지원을 해제 해보십시오. This question은 개별 CPP 파일에 대해이를 수행하는 방법을 보여줍니다. 기본적으로 효과적으로 컴파일됩니다.

경고 :이 경로를 사용하면 컴파일 된 헤더에 네이티브로 컴파일 한 CPP 파일을 해제해야 할 수 있습니다.

+0

이 질문을 게시하기 전에 이미이 작업을 수행했습니다. 나는 cpp 파일에 대한 CLR 지원을 가능하게했고, 나는 나의 문제 지점을 지나쳤다. 이제 CLR을 사용할 수없는 파일 인 sqlite.c에 문제가 있습니다. 컴파일러는 C 나 C++가 아니기 때문에 C++로 컴파일하지 못하고 C++로 컴파일하면 오류가 발생합니다. –

+0

명확히하기 위해, clr 지원을 활성화했을 때 프로그램의 일부가 작동했습니다. Document Manager.exe에서 'System.AccessViolationException'유형의 처리되지 않은 예외가 발생했습니다. 추가 정보 : 보호 된 메모리를 읽거나 쓰려고 시도했습니다. 이것은 종종 다른 메모리가 손상되었다는 표시입니다. –

+0

흠, 내가 그것에 대해 생각하게 해주세요 - 당신이 해결할 수 있기를 바랍니다! –

1

설명에서 사용자 정의 규칙에 맞을 수도 있습니다. C++에서는 클래스에 대해 여러 정의를 가질 수 있지만 모두 동일해야합니다. 이를 통해 클래스 정의를 헤더에 넣을 수 있습니다.

"동일"부분에주의해야합니다. 이것은 소스 코드의 토큰을 의미하는 것이 아니라 prceprocessor 이후의 교체 및 (실제로는) 현재 컴파일러 설정이 주어진 의미를 의미합니다. 분명한 예로는 32/64 비트 스위치 또는 정렬 설정을들 수 있는데, 이는 클래스의 크기를 변경할 수 있습니다.

다른 경우에는 Microsoft STL 클래스에 대해 두 가지 정의가있을 수 있습니다.

+0

나는 당신이 의미하는 것을 완전히 이해하지 못합니다. , 및 기타 모든 STD 라이브러리를 포함하는 단일 파일이 있고 그 위에 "#pragma once"가 있습니다 -이게 무슨 뜻입니까? –

+0

C++ 컴파일 규칙을 오해하고 있습니다. 기술적으로 .cpp 파일은 컴파일하지 않습니다. 각 전 처리기 출력 ("번역 단위")을 컴파일합니다. 두 번 포함 된 헤더 파일은 두 개의 서로 다른 번역 단위의 일부이며이 파일의 정의는 두 번 컴파일됩니다. – MSalters