Microsoft MVP성태의 닷넷 이야기
c# dll c++ 에서 사용하기 (event 사용) [링크 복사], [링크+제목 복사]
조회: 26445
글쓴 사람
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)
1332김동진10/16/201417071clickonce 와 smartscreen filter 기능에 대해서 [2]
1331궁굼합니다10/8/201411021loopback adapter 자동 설치가 가능 한가요? [2]
1330이현중10/8/201413472파일 다운로드 방법 문의 [2]파일 다운로드1
1329popo10/2/201411153싱글톤과 싱글톤 소멸자에 대해 궁금점이 있습니다. [1]
1328달쏭9/25/201411889WCF Service측에서 parameter 값이 null이 오는 이유를 알고 싶어요. [2]
1326궁굼합니다9/19/201411370VB의 Shell 기능과 완벽히 똑같은 기능의 함수 [4]
1325지현태9/18/201411065WPF 의존속성과 바인딩에 대한 질문입니다.. [1]파일 다운로드1
1324popo9/17/201410274wcf 질문 드립니다. [1]
1323Anon...9/17/201412461인스턴스와 객체의 차이 [1]
1322김영대9/16/201412197죄송하지만 .NET 관련 질문게시판이지만 혹시 ASP.NET MVC에 대해서 질문 드려도 됩니까 (__);; [2]
1321부탁드립...9/15/201413775윈도우 어플리케이션 개발 방법(?) 에대해(직접적인 코드라기보단 프로젝트 방향??) [14]
1320소켓서버...9/13/201413885서로다른 포트번호로 로컬 Socket 서버를 개설시 Close 문제 입니다. [2]
1319ㅇㅇ9/12/201414830134쪽 예제 오타 [3]
1318블루투쓰9/12/201410732page 184 질문드립니다. [1]
1316서동원8/21/201416895ActiveX 개체가 이 속성 또는 메서드를 지원하지 않습니다. [1]
1313양해진8/20/201410092메시지창에 대해서요 [1]
1312김영대8/18/201411711안녕하십니까 정성태님 죄송하지만 C#.NET의 FileInfo 클래스의 CopyTo 메서드 질문드립니다. [3]
1311김솔8/18/201412564nsis파일 수정중에요! [2]
1310조정용8/17/201413448WCF 프로그램에서 Task를 이용한 백그라운드 작업 시 클라이언트에 대한 병목현상. [4]파일 다운로드1
1309서동원8/12/201411610안녕하세요. embeded dll과 관련하여 질문드립니다. [4]
1308김솔8/11/201416191리스트뷰에서 중복파일체크를 하고싶습니다. [3]
1306이상현8/7/20149927Entity 프레임웍에서 테이블만 추가로 등록하는 방법
1307이상현8/7/201410241    답변글 [답변]: 자답이네요. [1]
1305popo8/7/201411502wpf UserControl List 바인딩 질문 입니다. [1]
1304민경수8/7/201414024네이버 카페에 구글 스프레드 시트 삽입 [1]
1303김동진8/7/201411243vmware환경에서 Guest IP를 192대역으로 받을 수 있는 방법은 없을까요~? [3]
... 46  47  48  49  50  51  52  [53]  54  55  56  57  58  59  60  ...