Tech & IT/프로그래밍

IDL 파일에 사용자지정 구조체 사용하기[데브에서 퍼옴]

해피콧 2010. 5. 22. 02:53
'); }
'); }

IDL 파일에 사용자지정 구조체 사용하기[데브에서 퍼옴] [Tip]



http://blog.hanafos.com/jaxal/6

==================

구조체만 넘기는 방법

==================

 

1. IDL파일에 구조체를 정의하세요

 

    typedef

    [uuid(GUID직접생성해서 넣기)] //직접id생성

    struct myUDT

    {

          [helpstring("no")]long a1;

          [helpstring("string")]BSTR pbstr;

    } myUDT;

 

2. 구조체 입출력 인터페이스 함수 정의

               [id(4), helpstring("method GetUDT")] HRESULT GetUDT([in,out] myUDT *p1);

 

3. 코드를 작성

STDMETHOD(GetUDT)(/*[in,out]*/ myUDT *p1);

STDMETHODIMP CDWMath::GetUDT(myUDT *p1)

{

    //ATL에서 정의 된 구조체를 사용하는 예제

    // 한개의 구조체를 입출력하는 경우

 

    USES_CONVERSION;

 

    char str[255];

    p1->a1 = 100;

    strcpy(str , OLE2T(p1->pbstr));

    //::AfxMessageBox ( str );

 

    MessageBox(NULL,str,"Test",MB_OK);

 

    return S_OK;

}

 

======================

구조체 배열을 넘기는 방법

======================

 

1.인터페이스 함수 정의

      [id(5), helpstring("method GetUDTArray")] HRESULT GetUDTArray([in,out]SAFEARRAY (myUDT)*uArray);

 

2. 코드작성

STDMETHOD(GetUDTArray)(/*[in,out]*/SAFEARRAY **uArray);

STDMETHODIMP CDWMath::GetUDTArray(SAFEARRAY **uArray)

{

    //구조체 배열을 통한 데이터 출력

    // VB에서는 선언만 하고 C++에서 메모리 할당함

 

    long startNo,lElements;

    HRESULT lResult;

 

 

    // 구조체에 UUID를 설정하고 컴파일 했으나 이상하게도

    // GUID_myUDT가 생성이 않되어 직접 코딩 해줌....

 

    static const GUID GUID_myUDT =

    { 0x직접생성해서넣기, 0xc336, 0x4c7f, { 0x80, 0xab, 0x2f, 0x6a, 0xa2, 0x3c, 0x8c, 0x24 } };

 

    HRESULT hresult,hr;

 

    {

        ITypeInfo* pTypeInfo = NULL;

        ITypeLib*  pTypelib = NULL;

 

        IRecordInfo* pRecInfo = NULL;

 

        hr = LoadRegTypeLib(LIBID_MATH4VBLib , 1, 0, GetUserDefaultLCID(), &pTypelib);

                                                   //현재 코딩중인 IDL파일의 ID로 변경하시요.

 

        hr = pTypelib->GetTypeInfoOfGuid(GUID_myUDT, &pTypeInfo);

        hr = GetRecordInfoFromTypeInfo(pTypeInfo, &pRecInfo);

 

        pTypeInfo->Release();

        pTypelib->Release ();

 

        SAFEARRAYBOUND bounds = {4, 0};

        *uArray = SafeArrayCreateEx(VT_RECORD, 1, &bounds, pRecInfo);

 

        if( FAILED(SafeArrayAllocData(*uArray)))

        {

           SafeArrayDestroyDescriptor(*uArray);

           return S_OK;

        }

    }

 

    myUDT *pArray;

    SafeArrayAccessData(*uArray, (void**)&pArray);

    for(int i=0; i<4; i++)  

    {

        pArray[i].a1 = i ;

        pArray[i].pbstr = L"Test";

    }

    SafeArrayUnaccessData(*uArray);

 

    return S_OK;

}