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 | 31 |
Tags
- self-signed ssl
- C/C++
- phpmailer
- GDI
- php
- .net
- ClickOnce
- net
- 설치제거
- 블루투스 헤드셋
- 와이브로
- plcrashreporter
- C#
- EUC-KR
- crashlog
- 크래시로그
- MFC
- Font
- M8200
- Antialiasing
- 데이터 전달
- VS2008
- docker
- 자바스크립트
- PDA
- 한 번만 실행
- protobuf-c
- 기념일관리
- API
- JavaScript
Archives
- Today
- Total
~☆~ 우하하!!~ 개발블로그
.NET의 Delegate를 관리되지 않는 코드(VC++모듈)에 전달하기 본문
반응형
[필요한 상황]
.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 배포페이지 구성 방법 (9) | 2008.09.11 |
| ClickOnce 플러그인 for FireFox (0) | 2008.09.11 |
| .NET Runtime이 설치되었는지 여부를 확인하는 자바스크립트 (0) | 2008.09.09 |