SourceForge.jp

dkutilDLLManager.h

説明を見る。
00001 
00007 #ifndef _dkutilDLLManager__h_
00008 #define _dkutilDLLManager__h_
00009 
00010 
00011 #include "dkutilMap.h"
00012 #include "dKingyoMacro.h"
00013 #include "dkutilGetParam.h"
00014 #include "dkutilBuffer.h"
00015 #include "dkutilString.h"
00016 
00017 namespace dkutil{
00018 
00019 
00020 
00021 
00022 class DLLManager{
00023 public:
00024     /*
00025     typedef std::map<std::string,void *> CONTAINER_TYPE;
00026     typedef std::pair<std::string,void *> DATA_TYPE;
00027     typedef std::pair<CONTAINER_TYPE::iterator,bool> RESULT;
00028     typedef std::pair<bool,void *> GET_DATA;
00029     typedef CONTAINER_TYPE::iterator iterator;
00030     */
00031     typedef map_ex<std::string,void *> CONTAINER_TYPE;
00032     typedef CONTAINER_TYPE::DATA_TYPE DATA_TYPE;
00033     typedef CONTAINER_TYPE::RESULT RESULT;
00034     
00035     //typedef CONTAINER_TYPE::GET_DATA GET_DATA;
00036     typedef CONTAINER_TYPE::iterator iterator;
00037 
00038 private:
00039     CONTAINER_TYPE mMap;
00040     HMODULE mhLib;
00041     std::string mDLLName;
00042 
00043     bool LoadDLL(const char *filename){
00044         if(mhLib){
00045             if(false==UnloadDLL()){
00046                 throw std::runtime_error("ありえないエラー");
00047             }
00048         }
00049         if(!filename) return false;
00050         mhLib = LoadLibrary(filename);
00051         if(mhLib==NULL) return false;
00052         return true;
00053     }
00054     bool UnloadDLL(){
00055         if(mhLib){
00056             FreeLibrary(mhLib);
00057             mhLib=NULL;
00058             return true;
00059         }
00060         return false;
00061     }
00062     void *GetAddress(const char *name){
00063         if(!name || mhLib==NULL) return NULL;
00064         void *ptr=NULL;
00065 
00066         ptr = (void *)::GetProcAddress(mhLib,name);
00067 
00068 
00069         if(ptr==NULL) return NULL;
00070         RESULT r;
00071         DATA_TYPE data(name,ptr);
00072     r = mMap.insert(data);
00073         if(r.second == false) return NULL;
00074         return ptr;
00075     }
00076 
00077 public:
00082     bool reset(const char *dllname){
00083         mMap.clear();
00084         mhLib=NULL;
00085         mDLLName.clear();
00086         if(!dllname){ return false;}
00087         if(false==LoadDLL(dllname)){ return false;}
00088         mDLLName = dllname;
00089         return true;
00090     }
00091     const char *name()const{return mDLLName.c_str();}
00092     bool empty()const{  return mDLLName.empty();}
00093         
00094         
00095     DLLManager(const char *dllname=NULL){
00096         if(dllname){
00097             reset(dllname);
00098         }
00099     }
00100     virtual ~DLLManager(){
00101         UnloadDLL();
00102     }
00107     void *find(const char *key){
00108         iterator it = mMap.find(key);
00109         if(it!=mMap.end()){
00110             return (*it).second;
00111         }
00112         return GetAddress(key);
00113     }
00115     bool load_function(const char *function_name){
00116         return (NULL != find(function_name));
00117     }
00118     struct DLLVersion{
00119         int v1,v2,v3,v4;
00120     };
00121     bool GetDLLFileVersion(DLLVersion *dll)const{
00122         GetVersionInfo v;
00123         char buff[1024]="";
00124         if(dll==NULL || empty()) return false;
00125 
00126         if(false==v.GetInfo(name(),buff,sizeof(buff),"FILEVERSION"))
00127         {
00128             return false;
00129         }
00130         VS_FIXEDFILEINFO viif={0};
00131         v.GetFileInfo(name(),&viif);
00132         size_t len = strlen(buff);
00133         {
00134             //バージョン文字列をパーシング
00135             const char bn = 4;
00136             char b[bn][32];
00137             {for(int i=0;i<bn;i++){
00138                 memset(b[i],0,sizeof(b[i]));
00139             }}
00140 
00141             int co = 0;
00142 
00143             offset_pusher<char> p(b[co],sizeof(b[co]) - 1);
00144             for(size_t i=0;i<len;i++)
00145             {
00146                 if(buff[i] == ',' || buff[i] == '.')
00147                 {
00148                     co ++;
00149                     // 第二引数が -1 なのは、NULL文字考慮のため
00150                     p.reset(b[co],sizeof(b[co]) - 1);
00151                     continue;
00152                 }
00153                 p.push_back(&buff[i],sizeof(char));
00154             }
00155             
00156             //バージョンをint値にして格納
00157             {
00158                 int vb[bn];
00159                 memset(vb,0,sizeof(vb));
00160                 radix_convert conv;
00161                 int *target = vb;
00162                 for(int i=0;i<bn;i++)
00163                 {
00164                     bool isHEX = false;
00165                     {
00166                         size_t se = strlen(b[i]);
00167                         int c;
00168                         for(size_t j=0;j<se;j++){
00169                             c = b[i][j];
00170                             if(('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')){
00171                                 isHEX = true;
00172                                 break;
00173                             }else if(isAlpha(c))
00174                             {//16進法じゃないみたいだから、これは数字化できないよん!
00175                                 return false;
00176                             }
00177                         }
00178                     }
00179                     if(isHEX){
00180                         (*target) = conv.a16toi(b[i]);
00181                     }else{
00182                         (*target) = ::atoi(b[i]);
00183                     }
00184                     target++;
00185                 }
00186                 dll->v1 = vb[0];
00187                 dll->v2 = vb[1];
00188                 dll->v3 = vb[2];
00189                 dll->v4 = vb[3];
00190             }
00191         
00192         }
00193         return true;
00194     }
00195 
00196 
00197 };//end of class
00198 
00199 
00200 
00201 
00202 }//end of dkutil namespace
00203 
00204 
00205 #endif//end of include once
00206 

dkutil 1.02リリース前 d金魚専用マニュアルバージョンに対してSun Dec 28 21:23:07 2003に生成されました。 doxygen 1.3.5