Microsoft MVP성태의 닷넷 이야기
c# dll c++ 에서 사용하기 (event 사용) [링크 복사], [링크+제목 복사]
조회: 21674
글쓴 사람
sequel2 (step4u at gmail.com)
홈페이지
첨부 파일
 
프로젝트 파일 첨부합니다.
압축을 풀으시면 프로젝트가 두개가 나옵니다.
프로젝트는 VS2012로 작성되었습니다.

1. CSharpDlls
2. MFCApplication1

질문
- 1번 C# Dll 중 HCSPHONE.dll 을 MFCApplication1 에 import 하여 HCSPHONELIBS.dll 에 있는 StandByList.xaml 의 ListView를 더블클릭하여 발생하는 이벤트 및 선택한 값을 MFCApplication1 으로 넘겨 주려 합니다.
- regasm /tlb HCSPHONE.dll 로 tlb 파일 생성하여 레지스트리에 등록 하여 import 까지 하여 C# 윈도우 까지 띄웠습니다.
그런데 C# 윈도우에서 발생하는 이벤트를 MFCApplication1 에서 받아 오려니 이런 저런 정보를 찾아 봐도 문제 해결이 안되어 여기까지 왔습니다.

VB6.0은 생각보다 방법이 쉬워서 해결이 되었습니다만
C를 포함한 C++/VC++/MFC 등의 C 계열을 잘 모르는 저로서는 그렇게 어려울 수가 없네요...
프로젝트를 한번 살펴보시고 도움 되는 말씀 부탁 드립니다.

MFCApplication1
- MainFrm.h 8줄 >> HCSPHONE.tlb import
- MainFrm.cpp 72~105줄 >> HCSPHONE.dll 의 메서드 호출하여 C# 윈도우 띄우고 이벤트 등록, 102줄 에러.


CSharpDlls
- HCPHONE 프로젝트에 HCSPHONELIB 프로젝트의 윈도우폼(com.huen.View.StandByList.xaml)을 띄우는 메서드와, ListView 의 리스트를 더블클릭하여 값을 넘겨주는 이벤트를 Delegate로 정의 하였습니다.


3줄 요약
1. C# dll을 C에서 import 하여 윈도우 폼 호출.
2. C# 윈도우폼에서 발생하는 이벤트를 C 프로그램에서 받아오고 싶다.
3. 여러 방도를 찾아보고 시도해 보았으나 event 를 받아오는 방법을 모르겠다. c# dll 에 정의된 이벤트(값포함) 를 C에서 받아오는 방법을 알고 싶다.

프로젝트 파일 링크 체크 박스 uncheck 하시고 다운 받으세요.






[최초 등록일: ]
[최종 수정일: 4/16/2013]


비밀번호

댓글 작성자
 



2013-04-16 04시36분
첨부파일이 커서 링크로 대체합니다.
Jae-Chul Lee
2013-04-16 04시47분
다음의 글을 참고하시면 됩니다. ^^

Sinking events from managed code in unmanaged C++
; http://www.codeproject.com/Articles/25524/Sinking-events-from-managed-code-in-unmanaged-C

COM 기술로 접근하고 싶지 않다면, 그냥 C++의 함수 포인터를 C#으로 전달하고 그것을 이벤트처럼 호출하는 것도 가능합니다.
정성태
2013-04-18 07시18분
링크 감사합니다. ^^
어제는 테스트 못하고 오늘 해봤는데요. 약간의 문제가 있습니다.
링크 내용은 C 소스에서 COM(C#으로 구현)객체의 메서드를 호출하면서 이벤트가 발생하게 하는건데요. 그렇게 하면은 이벤트가 정상적으로 발생합니다.
그러나 같은 방법으로 COM 객체의 윈도우에서 마우스 클릭등으로 이벤트를 발생을 시킬 경우 에는 오류가 발생 하는데 어떻게 해야할지 모르겠네요. ㅜ.ㅜ
sequel2
2013-04-18 02시00분
재현 가능한 최소화된 예제를 좀 보내주시겠어요. ^^
정성태
2013-04-18 04시06분
이제서야 봤습니다. 감사합니다. 아래 링크로 프로젝트(C#, MFC 프로젝트) 올려놨습니다.
http://www1.datafilehost.com/d/f66c3d0c
번거로우시더라도 한번만 살펴봐 주시면 감사하겠습니다.^^
sequel2
2013-04-19 01시08분
음... ^^ 진행 중인 프로젝트 소스가 아니라, 문제만 간단하게 재현되는 예제를 구성해서 올려주세요. 왜냐하면, 그렇게 문제를 단순화해 가는 중에 어떤 것이 원인인지를 알게 되는 경우가 있기 때문입니다.
정성태
2013-04-19 01시59분
진행중인건 아니구요. 테스트 프로젝트 입니다. 보시면 그냥 기본적인 모양만 뜰겁니다.
HCSPHONE.dll 의 Show() 메서드 호출해서 HCSPHONELIBS.dll View/StandByList.xaml 을 띄우고 StandByList.xaml 리스트를 더블클릭하면 해당 IDX를 HCSPHONE.dll로 넘겨주고 HCSPHONE.dll 에서는 다시 C/VB로 이벤트와 값을 넘겨주는 구조로 되어 있습니다.
sequel2
2013-04-19 02시10분
아니 그냥 좀 더 간소화 해서 드릴게요. ^^
sequel2
2013-04-19 04시55분
http://www1.datafilehost.com/d/9f1a63d7
간소화 한 파일입니다. ^^
sequel2
2013-04-21 01시26분
답을 가르쳐 드리면 재미가 없을 것 같군요. ^^ 단지, Show로 뜬 WPF 윈도우가 Modeless로 호출되었다는 힌트만 드리겠습니다.
정성태
2013-04-21 12시56분
감이 잘 안오는데요. ^^;
Modaless로 띄운 건 맞는데...
월요일 까지 고민 해보고 정말 안되면 다시 물어볼게요.
sequel2
2013-04-23 05시45분
흠 살펴봐도 어떻게 처리해야할지 잘 모르겠어요.
WPF에서 Modeless로 띄우는 방법이 따로 있던데 user32.dll Windows native method를 이용하는 것이 맞는지요?
그리고 지금은 CallAgent 라는 클래스에서 MainWindow를 따로 호출 하는 방식인데 MFC에서 MainWindow를 직접 호출해야 하는가요?
sequel2
2013-04-23 11시55분
그 다음 힌트는, "COM 개체는 Apartment 안에서 안정성이 보장된다"입니다.
정성태
2013-04-27 05시18분
Apartment는 실행중일 동안은 CoUninitial을 호출하지 않는 것으로 처리 했습니다. 단지 Modeless로 호출할 때(User32.dll 메서드이용) 윈도우가 안뜨는 문제가...
또 다른 힌트는 없을까요? 이거 하나로 1주일 넘게 잡고 있네요.
저도 이걸 계속 잡고 있을 형편이 못되어 틈틈히 테스트 해보느라 좀 더디긴 하네요. ^^;
sequel2
2013-04-30 02시32분
CoUninitialize 문제를 수정한 것은 맞습니다. 그 외에 CallSharpWrapper 변수도 관리해야 하지 않을까요? 스택에 생성된 변수의 생명 주기가 올바른지 확인해 보시면 될 것 같습니다.
정성태
2013-05-01 11시39분
아이고야. 왜 그걸 생각 못했을까요...
공부를 발로 했네요..ㅜ.ㅜ
방금 잘 작동하는 것을 확인했습니다. 오랜 시간 동안 신경 써 주셔서 감사합니다. ^^
sequel2
2013-05-01 03시37분
해결하셨군요. ^^ 기쁜 소식입니다. (사실, 저도 가끔 그런 실수로 며칠 헤매기도 합니다.)
정성태

... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1233(none)3/9/20147764(글쓴이의 요청으로 삭제합니다.) [4]
1232(none)3/8/20146896(글쓴이의 요청으로 삭제합니다.) [2]
1231(none)3/7/20148211(글쓴이의 요청으로 삭제합니다.) [9]
1230POCO3/7/20148770쓰레드 안에서 DependencyProperty get, set시 또 다른 스레드 오류.. [1]
1229(none)3/6/20148185(글쓴이의 요청으로 삭제합니다.) [11]
1228POCO3/6/20146738안녕하세요. 질문이 있습니다. [1]
1226김형진3/4/201411604안녕하세요 windows azure에 관해 질문했던 사람입니다. [2]
1224(none)3/3/201410536(글쓴이의 요청으로 삭제합니다.) [11]
1223sadfsaf3/3/20147258아래 질문에 답변 감사드립니다. 한가지 더 궁금한점이 있어 질문드립니다. [1]
1222(none)3/2/20147768(글쓴이의 요청으로 삭제합니다.) [4]
1221(none)3/1/20148057(글쓴이의 요청으로 삭제합니다.) [2]
1220Until2/28/20146892질문드립니다. [1]
1219이성환2/28/20146947string.Join()과 Enumerable.Aggregate()의 차이가 궁금합니다. [2]파일 다운로드1
1218김형진2/25/20147925안녕하세요. window azure에 대해서 질문이 있어서 문의 드립니다 [4]
1217(none)2/23/20147724(글쓴이의 요청으로 삭제합니다.) [1]
1215아리수2/20/201411419C# 공부하면서 WPF에 대한 질문. [2]
1214조광훈2/20/201410493IIS8 응용프로그램 풀 관련 질문 드립니다. [2]파일 다운로드1
1213김태훈2/17/20147213가상화 프로그램 질문입니다. [1]파일 다운로드1
1212조광훈2/13/20146425ISAPI 필터에서 커스텀 헤더 정보 추가 [1]파일 다운로드1
1211조광훈2/12/20149326isapi 필터 로드 오류 [2]
1208박지호2/9/201411738[오타] 시작하세요 C# 프로그래밍 p.267 ~ 350 [1]
1207임동찬2/5/20146536Web페이지에서 .net application 실행시키는 방법 [3]
1206신지환2/3/20149026visual sourcesafe(internet) 체크인 에러 [1]
1205박지호2/2/20149545[오타] 시작하세요 C# 프로그래밍 p.199 ~ 202 [1]
1204김태훈1/27/201421605Windows Service 오류 문의입니다. [2]
1203박지호1/26/201411361[오타] 시작하세요 C# 프로그래밍 p.131, 157, 180 [1]
... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...