반응형

COM의 Return Type : HRESULT

 

COM은 리턴타입은 이걸루한다. 라고 정의하고 있는데요.(절대루 COM내부의 모든 함수를 의미하는 것이 아닙니다. COM을 사용하는 외부 클라이언트가 호출하는 함수얘기입니다.)

어떤의미에서는 리턴타입이 통일되어야만 모든 언어에서 사용할수 있겠지요....(뭐 제 생각일뿐 이부분은 정확한거 아닙니다.)

 뭐 어쨌던간에 COM규약에는 리턴타입을 HRESULT로 정의하고 있고, 이것은 32bit로 되어있습니다. 표준으로 정의된 HRESULT값에는

 

S_OK

E_NOTIMPL

E_NOINTERFACE

E_OUTOFMEMORY

E_FAIL

 

이 있습니다. S_OK만이 참이고 다른것은 거짓이라고 할수 있지요...

그리고 이름보면 무슨 의미인지 알죠?

 

당신이 만든 COM함수가 HRESULT를 리턴하는 다음과 같은 형태일때

 

HRESULT A();

 

당신은

 if(A())

라고 쓰면 안됍니다. 리턴값은 참,거짓이 아닌 HRESULT로 들어옵니다.

 

그래서 이것을 위해 COM은 다음과 같은 매크로를 제공합니다.

SUCCEED와 FAILED입니다.

다음과 같이 쓸수 있습니다.

if(SUCCEED(A()))

{

   A가 참을 리턴할때 네용

}

 

if(FAILED(A()))

{

   A가 거짓을 리턴할때 네용

}

 

여기서 또 왜 참 거짓을 제공하지 않느냐.....라고 하는데....

 

HRESULT는 에러의 정보를 가지고 있을수 있으며 참거짓은 위의 두가지 매크로로 판별하고,

무엇이 에러인지는 리턴값을 비교하여 알수 있습니다. 대충 이렇겠지요

HRESULT hr;

if(hr = FAILED(A())

{

    if(hr ==E_OUTOFMEMORY)

   {

       메모리 부족으로 인해 처리해야 할 코드

   }

}

 

참고로 Visual Studio6의 경우에는(.net도 있겠지만 뭔지 전 모릅니다.) Error Lookup이라는 Tool을 제공하는데요. HRESULT값을 거기에다가 넣으면 무슨 에러인지 알수도 있습니다.(물론 HRESULT가 표준적인 값을 가지고 있어야 겠지요.

반응형

+ Recent posts