Microsoft MVP성태의 닷넷 이야기
c# dll c++ 에서 사용하기 (event 사용) [링크 복사], [링크+제목 복사]
조회: 26439
글쓴 사람
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)
3574김기술6/26/20159962프로그램 사용중 USB 경로 관련 해서 문의 드립니다 [4]
3573gagl...6/24/201512742IIS 의 특정 페이지들에서 20초의 딜레이가 있습니다. [2]
3572프란치스코6/24/201511209책을 구입하고 싶은데, [5]
3571로손6/22/201511260.Net COM dll 관련 사용시 Event 부분에 관한 문의 입니다. [5]파일 다운로드1
3570나그네6/11/201514093안녕하세요.. ^^ 궁금한게 있어서 혹시 조언을 얻을수 있을까 해서.. [2]
3569김지용6/9/201517013FFmpeg.exe 를 이용한 C# 동영상 인코더 예제보고 질문 드립니다. [9]
3568유동근6/5/201511465C# TTS 오류 입니다 도와주세요.파일 다운로드1
3567김보경5/26/201511953c#이용한 음성인식에 질문드립니다. [1]
3566로손5/26/201514280Http 파일 업로드시 한글파일명 관련 [1]
3565김태훈5/20/201510356AxWebBrowser 파일 다운로드 관련하여 문의드립니다. [3]
3564이강산5/20/201510206MD5 인코딩 관련 문의 입니다 [1]
2564CatO...5/13/201510963AppDomain 문제로 삽질중입니다. [2]
2563솔솔5/13/20159980custom search!! [1]
2562안녕하세요5/13/201510516안녕하세요.. C# 구조체 관련. [1]
2560솔솔5/6/201510392zip파일생성시. [1]
2561솔솔5/6/201510894    답변글 [답변]: zip파일생성시. [5]파일 다운로드1
2558로손5/4/201513666VB6.0의 ActiveX(OCX) 와 .Net에서 만든 COM DLL의 차이점 ?? [1]
2559로손5/6/201511261    답변글 [답변]: VB6.0의 ActiveX(OCX) 와 .Net에서 만든 COM DLL의 차이점 ??
2557Guest4/24/201510169Serialize , DeSerialize 관련 질문입니다! [3]
1558민식짱4/23/201510456FFmpeg.exe 를 이용한 C# 동영상 인코더 예제를 보고 질문드립니다 [1]파일 다운로드1
1555김응규4/22/201514672WCF net.tcp 관련해서 질문 드립니다. [2]
1556김응규4/22/201512036    답변글 [답변]: WCF net.tcp 관련해서 질문 드립니다. [1]파일 다운로드1
1554(삭제)4/19/201512788안드로이드 에뮬레이터에서 특정 앱 구동불가할때! [2]
1552spow...4/18/201518708마이크로세컨드 단위의 Sleep이 필요한데 찾질 못하겠습니다. [5]
1553spow...4/18/201512016    답변글 [답변]: 마이크로세컨드 단위의 Sleep이 필요한데 찾질 못하겠습니다. [1]
1551인디언기...4/16/201511408iisnode에 대해서 글 올리셨던데 질문이 있습니다 [1]
... 46  47  48  49  [50]  51  52  53  54  55  56  57  58  59  60  ...