성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C++과 C#의 Event 공유</h1> <p> C++과 C#에서 같은 이벤트로 동기화를 할 수 있을까요? 물론, 가능합니다.<br /> <br /> C++ 입장에서는 CreateEvent로 만든 HANDLE이고, 다행히 C#에서는 이를 기반으로 EventWaitHandle을 제공하기 때문에 서로 연동하는 것이 가능합니다.<br /> <br /> 가장 쉽게는 "이름 있는 Event"를 C++ 과 C# 양쪽에서 정의하는 것인데, 대략 다음과 같이 정의해 주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > === C# === EventWaitHandle ewh = <span style='color: blue; font-weight: bold'>new EventWaitHandle(false, EventResetMode.ManualReset, "Test.Event");</span> void threadFunc(object state) { int count = 0; while (ewh.WaitOne()) // 이벤트 대기 { ewh.Reset(); // ManualReset으로 설정했으므로 Reset 명시 Debug.WriteLine("Named Event - " + (count++) + ": TEST"); } } === C++ === HANDLE _eventHandle = <span style='color: blue; font-weight: bold'>::OpenEvent(EVENT_MODIFY_STATE, FALSE, L"Test.Event");</span> static DWORD WINAPI ThreadFunc( LPVOID lpParam ) { CMyObject *myObject = (CMyObject *)lpParam; while (true) { Sleep(5000); ::SetEvent(myObject->_eventHandle); // 이벤트 Trigger! } return 0; } </pre> <br /> "Named Event"를 사용하는 경우, 서로 다른 Process에서도 사용할 수 있기도 해서 장점이 있지만 "이름"이 알려진 만큼 관계없는 응용 프로그램에서 임의로 접근하는 것이 가능하다는 단점이 있습니다.<br /> <br /> 그래서, "Unnamed Event"을 사용하는데요. 이런 경우에는 C++ 과 C# 사이에 "하나의 Event" 인스턴스를 공유하기 위해 HANDLE 값 자체를 서로 알아야만 합니다. 일례로 C#에서 먼저 생성해서 그 핸들값을 C++ 에 넘겨주거나, 아니면 그 반대의 작업을 해주면 됩니다.<br /> <br /> 여기서는, C++에서 생성해서 C#으로 넘겨주어 연동하는 것을 간략하게 살펴보겠습니다.<br /> <br /> 우선, C++ 측에서 CreateEvent를 사용해서 이름을 생략하고 Win32 Event를 생성합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > === C++ === HANDLE _eventHandle = ::CreateEvent(NULL, TRUE, FALSE, NULL); </pre> <br /> 이것을 COM 개체라고 가정하고, 이런 경우 핸들값을 반환해주는 메서드가 필요한데요. 핸들값은 "void *" 형이기 때문에 주소를 담을 수 있어야 하므로 32비트/64비트 운영체제에 따라 그 값이 달라집니다. 이런 경우, 2개의 소스 코드 (또는 MACRO 처리)를 유지하지 않기 위해서는 그냥 높은 쪽에 맞춰주면 됩니다. 그래서, 다음과 같이 간단하게 값을 넘겨줄 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > CMyObject() { _eventHandle = ::CreateEvent(NULL, TRUE, FALSE, NULL); } STDMETHODIMP CMyObject::GetHandle(__int64* pHandle) { *pHandle = (__int64)_eventHandle; return S_OK; } </pre> <br /> C#에서는 이를 long형으로 받을 수 있겠고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > AtlTestLib.MyObjectClass myObj = new AtlTestLib.MyObjectClass(); <span style='color: blue; font-weight: bold'>long myValue</span> = myObj.GetHandle(); </pre> <br /> IntPtr로 형변환해서 원래의 EventWaitHandle에 넣어주면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > IntPtr ptr = new IntPtr(myValue); EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset); ewh.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(ptr, false); </pre> <br /> 이후부터는 C++에서 SetEvent를 해주면 C#에서는 WaitOne으로 대기하던 스레드가 깨어날 수 있습니다.<br /> <br /> (<a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=828&boardid=331301885'>첨부 파일은 위의 2가지 이벤트를 테스트한 코드</a>를 담고 있습니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1664
(왼쪽의 숫자를 입력해야 합니다.)