2009-04-02 4 views
2

우리는 현재 COM 개체를 호출하여 복잡한 대화 상자를 불러오는 몇 가지 대형 MFC 응용 프로그램을 보유하고 있습니다. 대화 상자를 응용 프로그램에 통합하려고합니다. COM 객체를 계속 사용하고 싶지는 않습니다.MFC 응용 프로그램에서 .NET 양식을 호출하려면 어떻게해야합니까?

.NET에서 별도의 프로젝트 (WPF가 아닌 Windows 형식 사용)로 대화 상자를 빌드하고 일반 C++ 코드에서 호출 할 수있는 두 번째 C++/CLI 프로젝트를 제공 할 수 있는지 조사하고 있습니다. 이 구조는 대화 상자를 통합해야하는 여러 응용 프로그램이 솔루션에서 프로젝트를 선택할 수 있도록하기위한 것입니다. (애플 리케이션은 레거시 애플 리케이션이며 광범위하게 재 작성하는 것은 불가능합니다 - 우리는 천천히 .NET으로 옮겨 가고 있습니다. 그러나 이것은 다년간의 프로젝트입니다.) 앱을 C++/CLI로 변환하는 것은 옵션이 아닙니다.

모델 응용 프로그램에서이 기능을 테스트하고 테스트했지만 지금까지는 가장 큰 응용 프로그램에서 작동하지 못했으며 읽은 일부 내용을 기반으로 시작했습니다. 그것이 가능하다는 것을 의심한다. (this link을 참조하십시오. 특히 this Stackoverflow question을 알고 있지만 관련성이없는 것 같습니다.)

So. 이것은 가능한가? 진행 방법에 대한 제안?

답변

0

. Boost 라이브러리의 스레딩이 기본 상태에서 C++/CLI와 호환되지 않는 문제가 두 가지있었습니다. 한 가지 해결책은 다른 플래그 집합을 사용하여 컴파일 한 다음 정적으로 링크하는 것입니다. 다른 하나는 동적으로 링크 된 DLL로 사용하는 것입니다.

해결 방법의 두 번째 부분은 연결 속성에서 STA에 대한 CLR 스레딩을 설정하는 것입니다. 그렇지 않으면 OLE 초기화가 도움이되지 않는 메시지와 함께 실패하기 때문에.

1

C++/CLI 프로젝트를 .NET 구성 요소로 호출하는 데 성공 했습니까? 나는 그것을 통과하지 못하고있는 두 층 사이를 좁히려 고 노력할 것입니다.

C++ 코드는 COM 구성 요소를 호출 할 수 있기 때문에 COM 지원을 사용하여 .NET dll을 컴파일하면됩니다. C++에서는 COM을 사용하지 않았으므로, 자세한 내용을 말할 수는 없습니다. 그러나 나는 많은 COM에 노출 된 .NET DLL을 만들었으며 그 편이 상당히 쉽습니다. 프로젝트 속성 (일반적으로 어셈블리 탭의 고급 단추 아래에 있음)의 확인란 몇 개만 있습니다.

+0

이미 C++ 기반 COM 구성 요소가 있습니다. 이 프로젝트의 핵심은 COM의 필요성을 없애는 것입니다. – mlo

+0

실행 전에 문제의 코드 근처에 OLE 초기화가 실패합니다. 그 오류를 인터넷으로 검색하면 첫 번째 링크로 연결됩니다. – mlo

0

왜 중매인이 필요합니까? 왜 그냥

Native C++ app --> C++/CLI class library 

는 C++/CLI 라이브러리는 CWinFormsView 또는 CWinFormsDialog 주위에 네이티브 래퍼를 제공합니다.

하지만 COM을 제거해야하는 이유는 무엇입니까? 충분히 빠르며 일단 인터페이스를 구현하면식이 너무 나쁘지 않습니다.

+0

기존 COM 객체에는 C++ 코드가 많이 있습니다. .NET으로 포팅하지 않을 것입니다. 내가 사용하고있는 구조는 오래된 C++ 코드 인 코드의 대부분에서 호출되는 별도의 C# 프로젝트로 두 개의 복잡한 대화 상자가 있습니다.그것은 지금처럼 주요 앱에서 호출됩니다. – mlo

+0

그렇다면 질문이 무엇인지 혼란 스럽습니다. 너는 이것을 가지고 있니, 없니? –

2

는 Windows가 사용자 정의 컨트롤에 Forms 컨트롤을 캡슐화하고 DDX_ManagedControl 사용하여 MFC 응용 프로그램에서 그들을 포함 : 나는 마침내 아주 좋은 Microsoft 지원 전문가의 도움으로이 문제를 해결

http://msdn.microsoft.com/en-us/magazine/cc163605.aspx

관련 문제