==================
구조체만 넘기는 방법
==================
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;
}
|