dllexport — плагины C ++, LoadLibrary / GetProcAddress нуждается в экспортируемой функции в каждой реализации

Я хочу создать плагин архитектуры. У меня есть DLL, которая будет служить интерфейсом, и тогда у меня будет несколько DLL для каждой реализации.

Normalizer.dll-интерфейс DLL

Normalizer.hpp

class INormalizer {
virtual ~INormalizer() { }
virtual std::string Normalize(const std::string& input) = 0;
virtual void Destroy() = 0;
}

NormalizerFactory.hpp

template<typename T> INormalizer* CreateT() { return new T; }

class NormalizerFactory {
public:
typedef std::map<std::string, INormalizer*(*)()> map_type;
static INormalizer* CreateInstance(const std::string& name) {
map_type::iterator it = getMap()->find(name);
if(it == getMap()->end()) {
return NULL;
}
return it->second();
}
protected:
static map_type* getMap() {
if(!_map) {
_map = new map_type;
}
return _map;
}
private:
static map_type* _map;
}

NormalizerFactory.cpp

NormalizerFactory::map_type* NormalizerFactory::_map = NULL;

DerivedRegister.hpp

template<typename T>
class DerivedRegister : NormalizerFactory {
public:
DerivedRegister(const std::string& name) {
getMap()->insert(std::make_pair(name, &createT<T>));
}
}

Normalizer.cpp

extern "C" __declspec(dllexport) INormalizer* __cdecl CreateNormalizer(const std::string& name) {
return NormalizerFactory::CreateInstance(name);
}

Normalizer.AlphaNumericOnly.dll

AlphaNumericOnly.h

class AlphaNumericOnly : public INormalizer {
public:
~AlphaNumericOnly();
std::string Normalize(const std::string& input) override;
void Destroy() override;
private:
static DerivedRegister<AlphaNumericOnly> _reg;
}

AlphaNumericOnly.cpp

...
DerivedRegister<AlphaNumericOnly> AlphaNUmericOnly::_reg("AlphaNumericOnly");
  • Q Как я могу заставить каждого исполнителя также включать DerivedRegister<T> _reg член без добавления к INormalizer интерфейс.

  • Q При сборке AlphaNumericOnly.dll компоновщик жалуется LNK2001 за NormalizerFactory::_map, Я не хочу определять статический член NormalizerFactory::_map в каждой реализации DLL.

Библиотеки реализации будут использованы LoadLibrary/GetProcAddress в клиентском приложении. Если я загружаю AlphaNumericOnly.dll с помощью LoadLibrary тогда вызов GetProcAddress(hDll, "CreateNormalizer") не удается, потому что CreateNormalizer функция не экспортируется в эту DLL.

  • Q Есть ли способ, которым я могу просто создать один файл экспорта и использовать его во всех библиотеках реализации и заставить всех разработчиков использовать этот файл DEF.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]