Я наткнулся на эту статью о Code Project, в которой говорится об использовании абстрактного интерфейса в качестве альтернативы экспорту всего класса из DLL C ++, чтобы избежать проблем с искажением имен. В определении интерфейса у автора есть метод Release()
, который должен вызываться пользователем для освобождения ресурсов объекта класса после его использования. Для автоматизации вызова этого метода автор также создает std::auto_ptr<T>
-подобный класс, который вызывает метод Release()
перед удалением объекта.
Мне было интересно, будет ли работать следующий подход:
#include <memory>
#if defined(XYZLIBRARY_EXPORT) // inside DLL
# define XYZAPI __declspec(dllexport)
#else // outside DLL
# define XYZAPI __declspec(dllimport)
#endif // XYZLIBRARY_EXPORT
// The abstract interface for Xyz object.
// No extra specifiers required.
struct IXyz
{
virtual int Foo(int n) = 0;
//No Release() method, sub-class' destructor does cleanup
//virtual void Release() = 0;
virtual ~IXyz() {}
};
// Factory function that creates instances of the Xyz object.
// Private function, do not use directly
extern "C" XYZAPI IXyz* __stdcall GetXyz_();
#define GetXyz() std::auto_ptr<IXyz>( GetXyz_() )
Конечно, GetXyz()
может быть глобальной функцией, определенной в заголовке, вместо #define
. Преимущество этого метода состоит в том, что нам не нужно создавать собственную производную auto_ptr
, которая вызывает метод Release()
.
Спасибо за ваши ответы,
Ashish.