Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- PDA
- 데이터 전달
- protobuf-c
- 크래시로그
- .net
- php
- docker
- VS2008
- C#
- 기념일관리
- API
- 한 번만 실행
- M8200
- plcrashreporter
- self-signed ssl
- net
- 블루투스 헤드셋
- MFC
- phpmailer
- C/C++
- 설치제거
- Font
- 와이브로
- ClickOnce
- crashlog
- GDI
- EUC-KR
- JavaScript
- Antialiasing
- 자바스크립트
Archives
- Today
- Total
~☆~ 우하하!!~ 개발블로그
.NET의 Delegate를 관리되지 않는 코드(VC++모듈)에 전달하기 본문
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);
}
.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);
}
반응형
'C# & .NET' 카테고리의 다른 글
[자바스크립트] 설치된 .NET Framework 알아오기 (0) | 2008.09.11 |
---|---|
ClickOnce 배포에서 프로그램 실행시 파라미터 전달하는 방법 (1) | 2008.09.11 |
ClickOnce 배포페이지 구성 방법 (8) | 2008.09.11 |
ClickOnce 플러그인 for FireFox (0) | 2008.09.11 |
.NET Runtime이 설치되었는지 여부를 확인하는 자바스크립트 (0) | 2008.09.09 |