Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.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)로 넘길 수만 있으면 됩니다.

코드를 첨부합니다.

고수님들의 조언 부탁드립니다.

좋은 하루 되세요.








[최초 등록일: ]
[최종 수정일: 5/2/2007]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

비밀번호

댓글 작성자
 




1  2  3  [4]  5 
NoWriterDateCnt.TitleFile(s)
58정성태7/29/20061668[질문] System.Diagnostics.Process 사용시
59정성태7/29/20061610    답변글 [답변]: Process.Start 로 다루지 마시고 COM 개체로 다루십시오
56정성태7/29/20062186[질문] CreateProcess 함수로실행되는프로그램의 디버깅은....
57정성태7/29/20062217    답변글 [답변]: CreateProcess 함수로실행되는프로그램의 디버깅은....
54정성태7/29/20061395[질문] Win32 API에서 얻은 소켓 핸들을 .Net의 Socket 객체로 연결..
55정성태7/29/20061503    답변글 [답변]: Win32 API에서 얻은 소켓 핸들을 .Net의 Socket 객체로 연결..
53정성태7/21/20061510[외부] How to add code behind file to existing page
52정성태7/13/20061859[외부] #line hidden vs. DebuggerNonUserCode attribute
51정성태7/9/20061544[외부] 질문 : Calling methods of deleted object
47정성태5/5/20061638[질문] 템플릿 클래스 멤버 함수의 오버로딩
48정성태5/5/20061792    답변글 [답변]: 템플릿 클래스 멤버 함수의 오버로딩
49정성태5/5/20061654        답변글 [진행상황]: 템플릿 클래스 멤버 함수의 오버로딩
45정성태5/5/20061791[질문] ODP를 사용한 오라클 UPDATE 문에서 에러발생 문제입니다
46정성태5/5/20061979    답변글 [답변]: ODP를 사용한 오라클 UPDATE 문에서 에러발생 문제입니다
43정성태5/5/20061525[질문] 쓰레드마다의 스택..
44정성태5/5/20061680    답변글 [답변]: 쓰레드마다의 스택..
41정성태5/5/20061684[질문] 제 PC 의 VS.NET 2005 에서는 특정 메뉴가 보이지 않습니다.
42정성태5/5/20061630    답변글 [답변]: 제 PC 의 VS.NET 2005 에서는 특정 메뉴가 보이지 않습니다.
39정성태5/5/20061551[질문/답변] COM+ 모듈 제작시 InitializesServerApplication 설정 방법 좀 알려주세요
37정성태5/5/20061515[질문] 필드 초기화를 선언과 함께 하는 것과 생성자에서 하는 것의 차이?
38정성태5/5/20061671    답변글 [답변]: 필드 초기화를 선언과 함께 하는 것과 생성자에서 하는 것의 차이?
35정성태5/5/20061586[질문] BinaryReader 로 String 을 읽어오는 데 정상적으로 읽어오지 않습니다.
36정성태5/5/20062547    답변글 [답변]: BinaryReader 로 String 을 읽어오는 데 정상적으로 읽어오지 않습니다.
33정성태5/5/20061637[질문] 레지스트리가 추가되었을때 확인하는 방법...
34정성태5/5/20061904    답변글 [답변]: 레지스트리가 추가되었을때 확인하는 방법...
30정성태5/5/20062085[질문] SocketOptionName.KeepAlive 사용법
1  2  3  [4]  5