2013-02-08 1 views
1

현재 메시지 박스 만 표시되는 단순한 관리되지 않는 C++ 메서드가 있습니다. 이에 대한 관리되는 C++ 래퍼를 작성한 후 C# 응용 프로그램에서 참조합니다. C#에서 관리되지 않는 C++로 문자열과 다른 변수를 전달할 수 있어야하지만 다시 C++ 지식이 매우 기본적인 문자열 변환에 문제가 있습니다.C#에서 관리되지 않는 C#로 관리되는 C++ 래퍼 사용

내 최종 목표는 내 새 C# 응용 프로그램 (DLLImport 또는 COM을 사용하지 않음)을 통해 기존의 관리되지 않는 C++ 라이브러리에서 복잡한 기능을 호출 할 수 있지만 진행하기 전에 간단한 예제를 만들려고합니다.

미리 감사드립니다. 당신이 계획하는 경우 사이에 더 광범위한 상호 운용성 일을

using namespace System::Runtime::InteropServices; 

namespace ManagedCpp 
{ 
    public ref class MessageBox 
    { 
    public: 
     static void Show(String^ message) 
     { 
#if defined(UNICODE) || defined(_UNICODE) 
      IntPtr intPtr = Marshal::StringToHGlobalUni(message); 
#else 
      IntPtr intPtr = Marshal::StringToHGlobalAnsi(message); 
#endif 

      UnmanagedCpp::MessageBox::Show(static_cast<LPTSTR>(intPtr.ToPointer())); 
      Marshal::FreeHGlobal(intPtr); 
     } 
    }; 
} 

:

namespace UnmanagedCpp 
{ 
    class MessageBox 
    { 
    public: 
     static void Show(LPCTSTR lpszMessage) 
     { 
      ::MessageBoxW(NULL, lpszMessage, L"Message", 0); 
     } 
    }; 
} 

당신은 이런 식으로 그것을 포장 수 : 관리되지 않는 C++ 방법을 가정 리치

+1

당신이 시도한 것의 예를 들어 보면 훨씬 좋을 것 같은 괜찮은 질문입니다. –

+0

몇 가지 코드를 포함시킬 수 있습니까? – yms

+0

System :: Runtime :: InteropServices :: Marshal :: StringToHGlobalAnsi (msg) .ToPointer()는 가장 유망한 것으로 보였지만 너무 많은 변형을 시도하여 모두 나열했습니다. 이상적으로 C#의 문자열에서 C++의 LPCTSTR로 가고 싶습니다. 그러나 C++ 지식이 부족하여 무엇이 어떻게 변환 될지 확신 할 수 없습니다. 관리되지 않는 C++ 그대로 유지하기 위해 Managed C++에서 변환이 필요하다고 생각합니다. – RichardE

답변

0

이 같이 보입니다 C# 및 C++에서는 기존 C++ 코드를 수정해야하지만 래퍼를 작성하지 않아도 COM을 사용하는 것이 좋습니다 (복잡한 시나리오에서는 복잡해집니다).

관련 문제