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

1  2  3  4  5  6  [7]  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5781List맨1/5/20233885List.Add("newobj") 속도는 빠른 편인지요? [11]
5780임세1/3/20234439C# 프로그래밍 10 책 구매한 사람입니다. 3부 자료는 어디서 다운 받을 수 있나요? [4]
5779이건우1/2/20233330안녕하십니까 루프안에서 메세지처리에 관하여 질문드립니다! [2]
5778이건우12/30/20224640안녕하세요 c#에서 dll참조 관련 질문드립니다. [4]
5777감사합니...12/29/20223605UI Thread에 Invoke 처리관련 궁금합니다. [3]
5776pdf맨12/28/20223395C# MouseUp Event + pdf [10]
5775민성12/28/20223182안녕하세요 Class 관련해서 예외처리를 하나로 받아낼수 있는 방법 [1]
5774중급12/27/20223978중급개발자란 어느 수준인지요? [4]
5773김영식12/26/20223560c# 압축파일 읽어 올 때 BinaryRead 한글 처리 문제 [1]
5772눈송이12/26/20223647Excel VSTO 는 왜 Net Core, Net 5, 6 버전을 사용하지 않나요? [2]
5771김훈12/26/20223737c# .net client application 망분리(내부망,외부망) 환경에서 의문의 외부사이트 호출 대기 [2]
5770lsh12/26/20223359클라우디움안에 있는 파일을 File.Copy 하고싶은데 코드로는 접근을 못하나요? [1]
5769울타리12/20/20223389Active Directory 2012R2 2016 또는 2019 마이그렝션 문의 드립니다. [1]
5768c++12/14/20224153Thread를 사용한 C++ DLL에 관련된 질문입니다. [6]파일 다운로드2
5767민성12/9/20223502안녕하세요 ashx로 화일을 저장하고 화일명을 리턴하는데요 [1]
5766김명훈12/9/20223647웹브라우저에서 묻지 않고 바로 다운로드 [2]
5765hong12/1/20223902Winform(.Net6) 클라이언트에서 SignalR Core 웹서버에 접속시 인증서 문제 [3]파일 다운로드1
5764요한11/30/20224082c++ 동일한 객체인지 비교 방법문의 [2]
5763고필석11/30/20223603시작하자마자 비정상 종료하는 프로세스에 대한 문제 해결 조언 요청 드립니다. [3]
5762흰털너부리11/30/20223579wpf mvvm ui update 로딩중 표시 [1]
5761민성11/29/20223487죄송하지만 한가지만 더 여쭈어 보겠습니다 [1]
5760민성11/29/20223408안녕하세요 [2]
5759문정환11/28/20223742c# socket 통신할때 빅엔디언으로 바꿔줘야 하나요? [1]
5758라떼11/28/20224977Linux 에서 winform UI 어플리케이션 실행하기 [3]
5757흰털너부리11/25/20223895asp.net core EF AddDbContext,AddDbContextFactory 차이점 알려주세요 [1]
5756흰털너부리11/25/20223477asp.net core web api에서 json 특정 property 무시하는 방법 문의 드립니다. System.Text.Json 사용중입니다. [1]
1  2  3  4  5  6  [7]  8  9  10  11  12  13  14  15  ...