오전 1:25 2001-05-03
조경민
Essential COM
#2 Interface
===================================================


HRESULT
--------------------------------------------------------
C++에서는 바로 COM 메소드 호출에 대한 결과를 보는데 쓰이고
VB같은 데에서는 런타임환경에서 자동으로 HRESULT의 결과를 보고
익셉션을 발생시킨다.
*[out, retval] 을 통해서 VB같은 곳에서의 메소드 logical return을
쓰게 된다.


#define SUCCEEDED(hr) (long(hr) >= 0)
#define FAILED(hr)    (long(hr) < 0)


HRESULT Symbolic Name


<facility>_<severity>_<information>

ex) STG_S_CONVERTED

STG = FACILITY_STORAGE
S = SEVERITY_SUCCEESS

보통은 FACILITY_NULL로 생략된 Common한 이름들이 있다.
S_OK - successful normal operation
S_FALSE - used to return logical false successfully
E_FAIL - generic failure
E_NOTIMPL- method not implemented
E_UNEXPECTED - method called at incorrect time

interface-specific HRESULT를 만들땐 FACILITY_ITF를 쓴다.
const HRESULT CALC_E_IAMHOSED =
      MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, 0x200 + 15 );
보통 시스템 HRESULT와 충돌을 막기위해서 0x200 이상을 써야한다.



GUID
--------------------------------------------------------
GUID는 UUID라는 DCE_RPC에서 있는 것을 기반으로 만들어진
유니크한 값이다.

프로그래밍적으로 값을 만들려면

HRESULT CoCreateGuid(GUID *pguid);

하면 된다.

이는 network interface address, wall click time, pair of
persistent counter, system clock에 의해서 만들어지는데
만일 네트워크가 안되는 컴퓨터라면 통계적인 유니크한 값이
생성되는데 , 이는 실제로는 로컬 컴퓨터 안에서만 유니크함을
이야기한다.

GUIDGEN.EXE를 이용하면 쉽게 얻어낼수도 있다.

typedef struct _GUID {
  DWORD Data1;
  WORD  Data2;
  WORD  Data3;
  BYTE  Data4[ 8 ];
}GUID;
typedef GUID IID; typedef GUID CLSID;

로 정의되며 GUID는 IID혹은 CLSID로 불린다.
큰값이기 때문에 실제 함수의 인자로 쓰이거나 할땐 효율을 위해서
참조자를 이용한다.

#define REFGUID const GUID&
#define REFIID const IID&
#define REFCLSID const CLSID&

그리고 GUID 값에 대한 == , != operator를 제공하기 위해
inline BOOL IsEqualGUID(REFGUID r1 , REFGUID r2 )
{ return !memcmp(&r1, &r2 , sizeof(GUID)); }

#define IsEqualIID(r2, r2) IsEqualGUID((r1),(r2))

#define IsEqualCLSID(r2, r2) IsEqualGUID((r1),(r2))

inline BOOL operator == (REFGUID r1, REFGUID r2)
{ return !memcmp(&r1, &r2, sizeof(GUID)); }

inline BOOL operator != (REFGUID r1, REFGUID r2)
{ return !(r1 == r2); }

'KB > MFC/Win32' 카테고리의 다른 글

[ddk] NT Kernel Driver  (0) 2004.03.19
[ddk] 드라이버에서 파일명 바꾸기  (0) 2004.03.19
COM 디버그  (0) 2004.03.19
원하는 인터페이스 가져다 쓰기  (0) 2004.03.19
[ActiveX] 보안코드 삽입  (1) 2004.03.19

+ Recent posts