QLibrary library;while(...){ ... ... library.setFileName(pluginsName); funcSetCallback = (protCallback) library.resolve("SetCallback"); if (funcSetCallback){ funcSetCallback(setText); }}
C++ (Qt)static QLibrary * theActiveLib = 0;...QLibrary library;... if (funcSetCallback){ theActiveLib = &library; funcSetCallback(setText); theActiveLib = 0; }...void setText( void ){ assert(theActiveLib); qDebug() << "caller is" << theActiveLib->fileName(); ...}
C++ (Qt)int FuncDLL1( int param );
C++ (Qt)int FuncDLL1_( int param, const QLibrary * theLib, void * ){// удобно и resolve свалить сюда static TFunc FuncDLL1 = 0; if (!FuncDLL1) FuncDLL1 = theLib->resolve("FuncDLL1"); assert(FuncDLL1); // запоминаем либу и/или вызываюшего theActLib = theLib; ... // вызываем int result = FuncDLL1(param); theActLib = 0; return result;}
C++ (Qt)std::maр <void *, QString> theMap;QString theActiveDLL; // получаем dll ф-цию которая вызовет setTextTFunc FuncDLL1 = library.resolve("FuncDLL1"); // запоминаем из какого файла эта ф-цияtheMap[(void *) FuncDLL1] = library.fileName();...// перед вызовом ф-ции устанавливаем имя dlltheActiveDLL = theMap.find((void *) FuncDLL1)->second;// вызываемFuncDLL1(..);
C++ (Qt)#include <iostream>#include <boost/function.hpp>#include <boost/bind.hpp> // Наша callback-функцияvoid setText( const std::string &str ){ std::cout << "Call setText( " << str << " )" << std::endl;} typedef boost::function<void ( const std::string & )> CallbackFunc; // ========================================================================// Этот класс просто эмитирует разделяемую библиотекуclass Dll{public: void setCallback( const CallbackFunc &fn ) { m_func = fn; } void run() { if( !m_func.empty() ) m_func( "Test string" ); } private: CallbackFunc m_func;}; // ========================================================================// Класс адаптор// Объект этого класса служит переходником, который сохраняет идентификатор// библиотекиclass Adaptor{public: Adaptor( const std::string &dllName, const CallbackFunc &fn ) : m_dllName( dllName ), m_func( fn ) { } void recall( const std::string &str ) { m_func( m_dllName + ";" + str ); } private: std::string m_dllName; CallbackFunc m_func;}; // ======================================================================== int main( int argc, char **argv ){ Dll dll1; Dll dll2; // Варианты с адаптором или без.#if 1 dll1.setCallback( boost::bind( &setText, _1 ) ); dll2.setCallback( boost::bind( &setText, _1 ) ); #else Adaptor a1( "first.dll", boost::bind( &setText, _1 ) ); Adaptor a2( "second.dll", boost::bind( &setText, _1 ) ); dll1.setCallback( boost::bind( &Adaptor::recall, &a1, _1 ) ); dll2.setCallback( boost::bind( &Adaptor::recall, &a2, _1 ) );#endif dll1.run(); dll2.run(); return 0;}