00001
00006 #include "..\stdafx.h"
00007
00008 #include "tools++.h"
00009 #include "WinDLLTool.h"
00010
00011
00012 using namespace jbxl;
00013 using namespace jbxwl;
00014
00015
00017
00018
00019
00020
00021
00022
00023
00030 void DLLModule::init(LPCTSTR fname, int n)
00031 {
00032 status = 0;
00033 fnum = n;
00034
00035 title = NULL;
00036 dllname = _T("");
00037 filename = _T("");
00038
00039 if (fname!=NULL) funcname = fname;
00040 else funcname = _T("");
00041
00042 hmod = NULL;
00043 pgetinfo = NULL;
00044 pfunc = NULL;
00045 if (fnum>0) pfunc = (void**)malloc(sizeof(void*)*fnum);
00046 }
00047
00048
00049
00053 void DLLModule::free()
00054 {
00055 status = 0;
00056
00057 hmod = NULL;
00058 pgetinfo = NULL;
00059 if (fnum>0 && pfunc!=NULL) ::free(pfunc);
00060 fnum = 0;
00061 pfunc = NULL;
00062 }
00063
00064
00065
00076 BOOL DLLModule::set_funcname(LPCTSTR fname, int n)
00077 {
00078 if (fname!=NULL) funcname = fname;
00079 else funcname = _T("");
00080
00081 if (fnum>0 && pfunc!=NULL) ::free(pfunc);
00082 pfunc = NULL;
00083
00084 fnum = n;
00085 if (fnum>0) pfunc = (void**)malloc(sizeof(void*)*fnum);
00086
00087 if (fname==NULL || n<=0) return FALSE;
00088 return TRUE;
00089 }
00090
00091
00092
00108 BOOL DLLModule::get_module_info(tList* lp)
00109 {
00110 if (lp==NULL) return FALSE;
00111 if (funcname==_T("")) return FALSE;
00112
00113 status = 0;
00114 hmod = (HMODULE)(lp->ldat.ptr);
00115 char* mbstr = ts2mbs(funcname);
00116 pgetinfo = (FUNC_STRING)GetProcAddress(hmod, mbstr);
00117 ::free(mbstr);
00118 if (pgetinfo==NULL) return FALSE;
00119
00120 dllname = mbs2ts((char*)(lp->ldat.key.buf));
00121 filename = mbs2ts((char*)(lp->ldat.val.buf));
00122 title = (*pgetinfo)(0);
00123
00124 pfunc[0] = (void*)pgetinfo;
00125 for (int i=1; i<fnum; i++) {
00126 char* nfn = (*pgetinfo)(i);
00127 void* pfn = (void*)GetProcAddress(hmod, nfn);
00128 pfunc[i] = pfn;
00129
00130
00131
00132
00133 }
00134
00135 status = 1;
00136 return TRUE;
00137 }
00138
00139
00140
00148 void* DLLModule::get_funcptr(int n)
00149 {
00150 if (status<=0) return NULL;
00151
00152 if (n>=fnum) n = 0;
00153 return pfunc[n];
00154 }
00155
00156
00157
00158
00160
00161
00162
00170 void DLLModuleTBL::init(LPCTSTR dirn)
00171 {
00172 tnum = vnum = 0;
00173 loaded = false;
00174 lp = NULL;
00175 dllmod = NULL;
00176 dirname = _T("");
00177
00178 if (dirn!=NULL) load_module(dirn);
00179 }
00180
00181
00182
00186 void DLLModuleTBL::free()
00187 {
00188
00189 if (dllmod!=NULL) {
00190 for (int i=0; i<vnum; i++) {
00191 if (dllmod[i]!=NULL) {
00192 dllmod[i]->free();
00193 delete(dllmod[i]);
00194 dllmod[i] = NULL;
00195 }
00196 }
00197 }
00198
00199 tList* lt = lp;
00200 while (lt!=NULL) {
00201 if (lt->ldat.ptr!=NULL) {
00202 FreeLibrary((HMODULE)(lt->ldat.ptr));
00203 lt->ldat.ptr = NULL;
00204 lt->ldat.sz = 0;
00205 }
00206 lt = lt->next;
00207 }
00208 del_all_tList(&lp);
00209
00210 tnum = vnum = 0;
00211 if (dllmod!=NULL) ::free(dllmod);
00212 dllmod = NULL;
00213 loaded = false;
00214 }
00215
00216
00217
00228 BOOL DLLModuleTBL::load_module(LPCTSTR dirn)
00229 {
00230 if (dirn!=NULL) dirname = dirn;
00231 else dirname = _T(".");
00232
00233 lp = get_dir_module((LPCTSTR)dirname);
00234 if (lp==NULL) return FALSE;
00235
00236 tnum = 0;
00237 tList* lt = lp;
00238 while (lt!=NULL) {
00239 tnum++;
00240 lt = lt->next;
00241 }
00242 loaded = true;
00243
00244 return TRUE;
00245 }
00246
00247
00248
00261 tList* DLLModuleTBL::get_dir_module(LPCTSTR dirn)
00262 {
00263 tList* lm;
00264 tList* lt;
00265
00266 if (dirn==NULL) return NULL;
00267 lm = lt = get_dir_files_t(dirn);
00268 if (lm==NULL) return NULL;
00269
00270 while (lt!=NULL) {
00271 HMODULE hmod = LoadLibrary((LPCTSTR)mbs2ts((char*)(lt->ldat.val.buf)));
00272 lt->ldat.ptr = (void*)hmod;
00273 char* fn = get_file_name((char*)(lt->ldat.val.buf));
00274 lt->ldat.key = make_Buffer_bystr(fn);
00275 lt = lt->next;
00276 }
00277
00278
00279 lt = lm;
00280 while (lt!=NULL) {
00281 if (lt->ldat.ptr==NULL) {
00282 tList* ln = lt;
00283 if (lm==lt) lm = lt->next;
00284 lt = lt->next;
00285 del_tList_node(&ln);
00286 }
00287 else lt = lt->next;
00288 }
00289
00290 return lm;
00291 }
00292
00293
00294
00303 void DLLModuleTBL::make_module_tbl(LPCTSTR fname, int m)
00304 {
00305 tList* lm = lp;
00306
00307 vnum = 0;
00308 if (fname==NULL) return;
00309
00310 dllmod = (DLLModule**)malloc(sizeof(DLLModule*)*tnum);
00311 if (dllmod==NULL) return;
00312
00313 int n = 0;
00314 if (m<=0) m = 1;
00315 while (lm!=NULL) {
00316 dllmod[n] = this->new_module(fname, m);
00317 int ret = dllmod[n]->get_module_info(lm);
00318 if (ret) {
00319 n++;
00320 if (n>=tnum) break;
00321 }
00322 else {
00323 delete(dllmod[n]);
00324 dllmod[n] = NULL;
00325 }
00326 lm = lm->next;
00327 }
00328 vnum = n;
00329
00330 this->set_module_function();
00331 return;
00332 }
00333
00334
00335