00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __PLUGIN_H__
00018 #define __PLUGIN_H__
00019
00020 #include <e32std.h>
00021
00022 template <class T> class CPlugIn
00023 {
00024 typedef T* (*TFactoryL)();
00025 public:
00026 static T* NewL(const TDesC& aDllName);
00027 void Close();
00028 protected:
00029 inline virtual ~CPlugIn() {}
00030 private:
00031 RLibrary iLibrary;
00032 };
00033
00034 template <class T> T* CPlugIn<T>::NewL(const TDesC& aDllName)
00035 {
00036 RLibrary l;
00037 User::LeaveIfError(l.Load(aDllName));
00038 CleanupClosePushL(l);
00039 T* plugin=TFactoryL(l.Lookup(1))();
00040 static_cast<CPlugIn<T>*>(plugin)->iLibrary=l;
00041 CleanupStack::Pop();
00042 return plugin;
00043 }
00044
00045 template <class T> void CPlugIn<T>::Close()
00046 {
00047 RLibrary l(iLibrary);
00048 delete this;
00049 l.Close();
00050 }
00051
00052 #endif
00053