Microsoft MVP성태의 닷넷 이야기
c# dll c++ 에서 사용하기 (event 사용) [링크 복사], [링크+제목 복사],
조회: 33500
글쓴 사람
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분
해결하셨군요. ^^ 기쁜 소식입니다. (사실, 저도 가끔 그런 실수로 며칠 헤매기도 합니다.)
정성태

... 76  77  78  79  80  81  82  83  84  85  [86]  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
321셈토2/18/200610832SPOOL --> EMF --> TEXTOUT [1]
320정보문2/18/200610617파일의 최대 크기2 [1]
318정보문2/18/200611761파일의 최대 크기
319정성태2/18/200611781    답변글 [답변]: 파일의 최대 크기 [1]
317narc...2/17/200610908[IE embeded SmartClient]에서 닷넷 리모팅 프록시 사용시 처음 2분간 딜레이현상이 발생합니다. [1]
322narc...2/20/200611725    답변글 [답변]: 다시한번 부탁드리겠습니다..
316이경찬2/15/200613137MSDN 매거진 정기구독 신청은 어디서 할수있나요? [1]
315정준명2/15/200616578[DxFramework Lite] 분산 트랜잭션에 참여하는 동안 오류가 발생했습니다. [2]
314이윤희2/14/200610787엑셀변환시....그림을 넣을려면. [1]
313장강현2/14/200610945SmartClient 디버그 문제 [1]
312정보문2/13/200611036방법2006 [1]
309정보문2/10/200612160edit & continue [3]
308김용국2/11/200610642스마트클라이언트 관련질문 [ Client 에서 WebPage의 JavaScript 호출방법이 있을까요? 있다고는 한것 같은데..부탁드림^^
310정성태2/11/200610143    답변글 [답변]: 스마트클라이언트 관련질문 [ Client 에서 WebPage의 JavaScript 호출방법이 있을까요? 있다고는 한것 같은데..부탁드림^^
307narc...2/10/200611862IE Embeded 스마트클라이언트는 UserControl만 가능한가요? [2]
305정보문2/10/200611999웹 컨트롤
306정성태2/10/200611659    답변글 [답변]: 웹 컨트롤
303정보문2/10/200612548회원가입성공을 기념으로 질문 한 가지 던집니다.
304정성태2/10/200610938    답변글 [답변]: 회원가입성공을 기념으로 질문 한 가지 던집니다.
302김성2/7/200612108C#이나 VB.NET 으로 만든 것을 SETUP 해서 배포하려고 하는데요.. [1]
301참깨2/3/200616349개체가 이 속성 또는 메소드를 지원하지 않습니다. [1]
300김종욱2/2/200610734안녕하세요 [2]
299꼬부기1/19/200610006스마트클라이언트 관련 질문입니다... [2]
298정말초짜1/12/200610243smart client 질문입니다. [1]
296우승우1/4/20069895스마트클라이언트에서 COM+를 이용한 데이터 가져 오기..
297정성태1/4/200611844    답변글 [답변]: 스마트클라이언트에서 COM+를 이용한 데이터 가져 오기.. [2]
... 76  77  78  79  80  81  82  83  84  85  [86]  87  88  89  90  ...