~☆~ 우하하!!~ 개발블로그

.NET의 Delegate를 관리되지 않는 코드(VC++모듈)에 전달하기 본문

C# & .NET

.NET의 Delegate를 관리되지 않는 코드(VC++모듈)에 전달하기

iwoohaha 2008. 8. 11. 12:25
728x90
반응형
[필요한 상황]
.NET 모듈과 VC++ 관리되지 않는 코드로 작성된 모듈의 연결
VC++ 관리되지 않는 코드로 작성된 모듈에서 특정 시점에 .NET 모듈에 정의된 delegate를 호출해야 하는 상황

.NET 모듈에서 VC++ 관리되지 않는 코드로 작성된 모듈의 export API 호출을 통해서 .NET 모듈의 delegate를 전달.

[VC++ 관리되지 않는 코드로 작성된 모듈]
VC++ 관리되지 않는 코드로 작성된 모듈에서 필요로 하는 함수 포인터 형식
typedef void (CALLBACK *TextSelectionChangedHandlerProc)(void);

위 형식의 함수포인터를 저장하기 위한 클래스 멤버 변수
TextSelectionChangedHandlerProc m_pTextSelectionChangedHandlerProc;

위 형식의 함수포인터를 VC++ 관리되지 않는 코드로 작성된 모듈에 설정하기 위한 API
extern "C" _MYEDITOR_API void SetTextSelectionChangedHandler(HWND hWnd, TextSelectionChangedHandlerProc func);

[.NET 모듈]
VC++ 관리되지 않는 코드로 작성된 모듈에서 특정 시점에 호출하게 될 함수
public class FormMyEditor
{
    ....
    private void TextSelectionChanged()
    {
        ....
    }
    ....
}

[VC++ 관리되지 않는 코드로 작성된 모듈로 전달할 델리게이트]
public delegate void TextSelectionChangedHandler();
public class FormMyEditor
{
    ....
    private TextSelectionChangedHandler _delegateTextSelectionChanged = null;
    private void FormMyEditor_Load(object sender, EventArgs e)
    {
        _delegateTextSelectionChanged = new TextSelectionChangedHandler(TextSelectionChanged);
        // VC++ 모듈의 export API 호출
        CMyEditorAPI.SetTextSelectionChangedHandler(_delegateTextSelectionChanged);
    }
}

[VC++ 모듈에 대한 C# 라이브러리]
public class CMyEditorAPI
{
    [DllImport("MyModule.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void SetTextSelectionChangedHandler(IntPtr hWnd, [MarshalAs(UnmanagedType.FunctionPtr)]TextSelectionChangedHandler proc);
}

반응형