IDL 파일에 사용자지정 구조체 사용하기[데브에서 퍼옴] [Tip] |
||||
================== 구조체만 넘기는 방법 ==================
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; }
|
'Tech & IT > 프로그래밍' 카테고리의 다른 글
VC++ 에서 Memory Leak 찾기 팁 (1) | 2010.07.20 |
---|---|
Base64 Encode/Decode (0) | 2010.06.29 |
두개의 오브젝트가 공통으로 사용하는 IDL 이 있을때 클라이언트에서 타입 라이브러리 사용 시 redefinition error 처리 방법 (0) | 2010.05.22 |
XML Schema (0) | 2010.04.27 |
[xml] 여러개의 xml로 나누기 (0) | 2010.04.26 |