diff options
Diffstat (limited to 'core/main.cpp')
-rw-r--r-- | core/main.cpp | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/core/main.cpp b/core/main.cpp index b5ff8e4..1068193 100644 --- a/core/main.cpp +++ b/core/main.cpp @@ -13,12 +13,15 @@ using namespace std; list<plugin*> plugins; list<service*> services; +bool shutdown_called = false; + int LoadModules(); INT_PTR CallService(const char *name, WPARAM w, LPARAM l); HANDLE CreateServiceFunction(const char *name, SERVICE pService); DWORD WINAPI OnModulesLoadedThread( LPVOID lpParam ); int ServiceExists(const char *name); SERVICE Test(WPARAM, LPARAM); +SERVICE Shutdown(WPARAM, LPARAM); PLUGINLINK link = {&CreateServiceFunction, &CallService, &ServiceExists}; @@ -26,11 +29,12 @@ int main(int argc, char *argv[]) { if(LoadModules()) return 1; //something wrong + CreateServiceFunction("Core/Test", (SERVICE)Test); + CreateServiceFunction("Core/Shutdown", (SERVICE)Shutdown); for(list<plugin*>::iterator p = plugins.begin(); p != plugins.end(); p++) //initializing plugins { (*p)->getFuncs().load(&link); } - CreateServiceFunction("Test", (SERVICE)Test); for(list<plugin*>::iterator p = plugins.begin(); p != plugins.end(); p++) { if((*p)->getFuncs().loaded) @@ -38,9 +42,24 @@ int main(int argc, char *argv[]) CreateThread(NULL, 0, OnModulesLoadedThread, (LPVOID)(*p)->getFuncs().loaded, 0, 0); } } - CallService("GetPluginInfoList", 0, 0); for(;;) + { + if(shutdown_called) + { + plugin *db; + for(list<plugin*>::iterator p = plugins.begin(); p != plugins.end(); p++) + { + if((*p)->getPluginInfo()->flags == F_DB_PLUGIN) + db = (*p); + else + delete (*p); //is it right? , at least do not crasing... + } + delete db; + plugins.clear(); + break; + } Sleep(1000); + } return 0; } @@ -61,10 +80,11 @@ int LoadModules() funcs.info = (SetPluginInfo)GetProcAddress(hPlugin, "SetPluginInfo"); funcs.load = (Load)GetProcAddress(hPlugin, "Load"); funcs.loaded = (OnModulesLoaded)GetProcAddress(hPlugin, "OnModulesLoaded"); + funcs.unload = (Unload)GetProcAddress(hPlugin, "Unload"); if(funcs.info && funcs.load) { PLUGININFO *pi = funcs.info(); - plugins.push_back(new plugin(hPlugin, funcs, pi->shortName)); + plugins.push_back(new plugin(hPlugin, funcs, pi)); } else FreeLibrary(hPlugin); @@ -86,38 +106,25 @@ int plugin::setHandle(const HMODULE &hMod) return 0; } -int plugin::setName(const char *name) -{ - if(strlen(name)< 2) - return 1; - szPluginName = new char [strlen(name)+1]; - strcpy(szPluginName, name); - return 0; -} - -const char* plugin::getName() -{ - return szPluginName; -} const plugin::exported_funcs_s plugin::getFuncs() { return funcs; } -const PLUGININFO plugin::getPluginInfo() +PLUGININFO *plugin::getPluginInfo() { return pluginInfo; } -plugin::plugin(const HMODULE hMod, const exported_funcs_s fnct, const char *name) +plugin::plugin(const HMODULE hMod, const exported_funcs_s fnct, PLUGININFO *info) { hModule = hMod; funcs = fnct; - szPluginName = new char [strlen(name)+1]; - strcpy(szPluginName, name); + pluginInfo = info; } plugin::~plugin() { + if(funcs.unload) + funcs.unload(); FreeLibrary(hModule); - free(szPluginName); } service::service(const char *name, SERVICE service) { @@ -164,6 +171,11 @@ SERVICE Test(WPARAM, LPARAM) return 0; } +SERVICE Shutdown(WPARAM, LPARAM) +{ + shutdown_called = true; +} + DWORD WINAPI OnModulesLoadedThread( LPVOID lpParam ) { OnModulesLoaded &l = (OnModulesLoaded&)lpParam; |