성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
VC++ / .NET 관련 질문
최근 덧글
[손님] 총9시간의 대공사 - 은퇴해야 되는 것인가 취미로 10여년 세월...
[손님] 용량이 커서 2017을 지우고 해야 될 듯한데 repos폴더를 ...
[손님] 2017버전버그 상의 문제군요ㅜㅜ
[정성태] 글쎄요, 과거에 partial로 디자인 코드가 빠지기 전("ht...
[손님] hts 공부해봤는데요 C++2.0 시절이어서 특히 UI(그래프)...
[정성태] IT 지식은 흐르는 맛이 있어야 해서... ^^ 그런 유료화는 ...
[손님] 월9천원부터 월1만9천원 구독료를 받고 일부 게시판을 유료화로 ...
[정성태] Why does the usage of the initial r...
[정성태] 솔직히는, 게시물 양에 비하면 집필에 도움이 되지는 않습니다. ...
[정성태] @김훈 아래의 글을 읽어보시고, 그래도 궁금하신 것이 있다면 다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
.NET Framework
VC++
COM 개체 관련
기타
부모글 보이기/감추기
내용
안녕하세요. 고수님들께 도움을 받기 위해 질문 올립니다. C# COM Server 코드는 아래와 같습니다. using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; using System.Windows.Forms; using System.Reflection; namespace MyInterop { [Guid("3E0E2EB2-CC13-40fb-9346-34809CB2418C")] public interface IMyDotNetInterface { void ShowDialog(out tagUnitEx[] pArrUnit); } [ClassInterface(ClassInterfaceType.None)] [Guid("3A13EB34-3930-4e06-A3EB-10724CCC2F4B")] public class MyDotNetClass : IMyDotNetInterface { public MyDotNetClass() {} public void ShowDialog(out tagUnitEx[] pArrUnit) { tagUnitEx[] arrIndex; arrIndex = new tagUnitEx[3]; arrIndex[0].strName = "coolfh"; arrIndex[0].nIndex = 11; arrIndex[1].strName = "ssim"; arrIndex[1].nIndex = 21; arrIndex[2].strName = "mist93"; arrIndex[2].nIndex = 31; pArrUnit = arrIndex; } } public struct tagUnitEx { public string strName; public long nIndex; } } 코드에서 처럼 tagUnitEx란 구조체에 string 및 long type의 맴버를 선언했고, Client쪽에서 pArrUnit을 요청하면 COM Server에서 배열의 크기(코드에서는 3)를 할당하고 값을 채워서 넘겨주는 방식입니다. tagUnitEx 맴버로 long type만 선언했을 경우에는 잘 동작하는데요. string type 맴버를 추가했더니 에러가 발생합니다. (아래 코드 참조) 다음은 C++ Client 코드입니다. m_pMyComp = IMyDotNetInterfacePtr(__uuidof(MyDotNetClass)); if(m_pMyComp) { tagSAFEARRAY* psArrIndex = NULL; try { m_pMyComp->ShowDialog(&psArrIndex); } catch(_com_error &e) { CString strDescription = (LPCSTR)(e.Description()); return TRUE; } tagUnitEx* pSaBuffer = NULL; ::SafeArrayAccessData(psArrIndex, reinterpret_cast<void HUGEP**>(&pSaBuffer)); ::SafeArrayUnaccessData(psArrIndex); return TRUE; } 위의 코드에서 m_pMyComp->ShowDialog(&psArrIndex); 여기서 에러가 발생하며, error description에는 "이전 형식이거나 잘못된 형식 라이브러리입니다." 라고 보여집니다. 구조체 맴버에 스트링이 없으면 잘 동작하는 코드인데요. 어떤 방법이던 간에 스트링을 포함한 구조체 배열을 C# 컴포넌트에서 C++ Client로 out(또는 ref)로 넘길 수만 있으면 됩니다. 코드를 첨부합니다. 고수님들의 조언 부탁드립니다. 좋은 하루 되세요.
첨부파일
스팸 방지용 인증 번호
1684
(왼쪽의 숫자를 입력해야 합니다.)