2010-08-29 3 views
3

Я хотел бы иметь возможность использовать стандартные символические имена для HRESULT, возвращаемые компонентами COM в моем .NET-коде. Например, я хотел бы иметь возможность писать код так:Символьные имена для COMException Коды ошибок HRESULT в .NET

try { 
    someComObject->DoSomething(); 
} 
catch (COMException ex) { 
    if (ex.ErrorCode == E_FAIL) { 
     HandleFail(); 
    } 
    else if (ex.ErrorCode == E_OUTOFMEMORY) { 
     HandleOutOfMemory(); 
    } 
    else { 
     HandleComError(ex.ErrorCode); 
    } 
} 

Однако, я не могу найти где-нибудь в рамках .NET, где символы, такие как E_FAIL, E_OUTOFMEMORY, E_UNEXPECTED, и так далее определяются , Для собственных приложений Win32 можно получить определения от <winerror.h> (см. http://msdn.microsoft.com/en-us/library/aa378137(VS.85).aspx).

Я могу, конечно, определить их сам, там, где они нужны мне, как это:

int E_FAIL = unchecked((int)0x80004005L); 

Но я бы предпочел, чтобы получить определения из стандартного места, если таковые имеются. Я думаю, что нашел их где-то один раз, но мои поисковые запросы MSDN не нашли их сейчас.

Есть ли набор таких определений где-то в библиотеках .NET?

+0

Множество определений в платформе .NET, все внутренние. Вы можете скопировать/вставить их с помощью Reflector. Но список pinvoke.net, вероятно, более полезен. –

ответ

2

Я не думаю, что есть один в самой структуре. Возможно, вы нашли это list at pinvoke.net. Не беспокойтесь о изменениях значений. Значения в файле заголовка C скомпилируются в приложениях, поэтому их нельзя изменить без нарушения каждого приложения COM.

Также вы не получите COMException для E_OUTOFMEMORY. Это создаст OutOfMemoryExcetpion. Время выполнения будет отображено HRESULTS, оно знает о значимых исключениях. См. mapping definition в MSDN.