Классы-оболочки (wrappers) предоставляют удобный объектно-ориентированный интерфейс для работы с основными компонентами. Они скрывают специфику COM за обычными классами языка C++.

Классы-оболочки очень компактны, обычно они имеют размер одного или двух указателей. Поэтому в функциях можно возвращать сами классы-оболочки, а не ссылки на них, не сильно проигрывая в эффективности.

Для обработки ошибочных ситуаций применяются три механизма, включение которых определяется макросами MA_USE_EXCEPTIONS и MA_CLASS_EXCEPTIONS.
  1. (MA_USE_EXCEPTIONS не определен) сохранение кода ошибки в глобальной переменной, из которой его можно прочитать с помощью функции
    HRESULT maGetLastError()
    
  2. (MA_USE_EXCEPTIONS определен, MA_CLASS_EXCEPTIONS не определен) Возбуждение исключений (C++ exceptions) типа int со значением, равным коду ошибки. В примере показано, как можно обрабатывать исключения.
    
    try{
        CmaIndex sz;
        CmaMatrix X(MA_DOUBLE, sz[168][7]);
     	
        // работа с матрицей
    
    }catch(int eCode){
        // сюда попадаем, только если произошла ошибка
        printf("Код ошибки= %x\n",eCode);
         //... Другие действия
    
    }
    
  3. (MA_USE_EXCEPTIONS и MA_CLASS_EXCEPTIONS определены) Возбуждение исключений (C++ exceptions) типа CmaException.
    class CmaException{
    public:
        int maLastError; 	// код ошибки
        char* fileName;     // имя файла, в котором произошла ошибка (maComClasses.h или maComClasses.cpp)
        int lineNo;		// номер строки, в которой произошла ошибка
        CmaException(int m_maLastError,int m_lineNo,char* m_fileName); // копирует свои параметры в поля класса
    };
    
    В примере показано, как в этом случае обрабатывать исключения.
    
    try{
        CmaIndex sz;
        CmaMatrix X(MA_DOUBLE, sz[168][7]);
    
        // работа с матрицей
    
    }catch(CmaException* E){
        // сюда попадаем, только если произошла ошибка
        printf("Ошибка на строке %d файла <%s> с кодом %x\n",E->lineNo,E->fileName,E->maLastError);
        //... Другие действия
    
    }
    
    
Код ошибки не зависит то механизма обработки ошибок. Этот код приведен в описании функций в разделе Код ошибки.