Тестирование софта - статьи


Создание динамически загружаемого класса - часть 2


Пусть в нашем случае это будет метод void DoSomething().

В итоге мы имеем следующее объявление интерфейса:

Код

#include <DynamicClass.hpp>

сlass MyTestInterface : public PDL::DynamicClass
{
public:
    /**
     * @brief Test method
     */
    virtual void DoSomething() throw() = 0;

    /**
     * @brief Declare this class dynamically loadable
     */
    DECLARE_DYNAMIC_CLASS( MyTestInterface )
};

Это объявление следует поместить в отдельный заголовочный файл, в нашем случае - MyTestInterface.hpp, потому как для обеспечения совместимости включаться он будет и при сборке динамически загружаемого класса, и при его непосредственной загрузке и использовании.

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

Код

#include <MyTestInterface.hpp>
#include <stdio.h>

class MyTestClass1 : public MyTestInterface
{
public:
    /**
     * @brief Test method
     */
    void DoSomething() throw()
    {
        fprintf( stderr, "MyTestClass1::DoSomething()\n" );
    }
};

EXPORT_DYNAMIC_CLASS( MyTestClass1 )

Взглянем на определение макроса EXPORT_DYNAMIC_CLASS (файл DynamicClass.hpp):

Код

#define EXPORT_DYNAMIC_CLASS( className ) \
extern "C" PDL_DECL_EXPORT PDL::DynamicClass * Create##className() \
{ \
    try { return new className(); } \
    catch( ... ) {;; } \
    return NULL; \
}

Этот макрос объявляет и определяет экспортируемую функцию Create<имя_класса>, которая создаёт и возвращает экземпляр указанного в параметре класса.


Начало  Назад  Вперед



Книжный магазин