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가 표준적인 값을 가지고 있어야 겠지요.