#include #include //#include #include #include #include "plugin.h" #include "service.h" using namespace std; list plugins; list services; int LoadModules(); INT_PTR CallService(const char *name, WPARAM w, LPARAM l); HANDLE CreateServiceFunction(const char *name, SERVICE pService); int ServiceExists(const char *name); SERVICE GetPluginInfoList(WPARAM, LPARAM); SERVICE Test(WPARAM, LPARAM); PLUGINLINK link = {&CreateServiceFunction, &CallService, &ServiceExists}; int main(int argc, char *argv[]) { if(LoadModules()) return 1; //something wrong for(list::iterator p = plugins.begin(); p != plugins.end(); p++) //initializing plugins { (*p)->getFuncs().load(&link); } CreateServiceFunction("GetPluginInfoList", (SERVICE)GetPluginInfoList); CreateServiceFunction("Test", (SERVICE)Test); for(list::iterator p = plugins.begin(); p != plugins.end(); p++) { if((*p)->getFuncs().loaded) (*p)->getFuncs().loaded(); } CallService("GetPluginInfoList", 0, 0); for(;;) Sleep(1000); return 0; } int LoadModules() { WIN32_FIND_DATAA findFileData; HANDLE hFile = 0; if(!(hFile = FindFirstFileA(".\\modules\\*", &findFileData))) return 1; //failed to find any plugins in directory HMODULE hPlugin = 0; char tmp[MAX_PATH] = {0}; plugin::exported_funcs_s funcs; while(hFile != INVALID_HANDLE_VALUE && GetLastError() != ERROR_NO_MORE_FILES) { strcpy(tmp, ".\\modules\\"); strcat(tmp, findFileData.cFileName); hPlugin = LoadLibraryA(tmp); funcs.info = (SetPluginInfo)GetProcAddress(hPlugin, "SetPluginInfo"); funcs.load = (Load)GetProcAddress(hPlugin, "Load"); funcs.loaded = (OnModulesLoaded)GetProcAddress(hPlugin, "OnModulesLoaded"); if(funcs.info && funcs.load) { PLUGININFO *pi = funcs.info(); plugins.push_back(new plugin(hPlugin, funcs, pi->shortName)); } else FreeLibrary(hPlugin); FindNextFileA(hFile, &findFileData); } return 0; } const HMODULE plugin::getHmodule() { return hModule; } int plugin::setHandle(const HMODULE &hMod) { if(!hMod) return 1; 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() { return pluginInfo; } plugin::plugin(const HMODULE hMod, const exported_funcs_s fnct, const char *name) { hModule = hMod; funcs = fnct; szPluginName = new char [strlen(name)+1]; strcpy(szPluginName, name); } plugin::~plugin() { FreeLibrary(hModule); free(szPluginName); } service::service(const char *name, SERVICE service) { szName = new char [strlen(name)+1]; strcpy(szName, name); pService = service; } const char *service::getName() { return szName; } const SERVICE service::getService() { return pService; } INT_PTR CallService(const char *name, WPARAM w, LPARAM l) { for(list::iterator p = services.begin(); p != services.end(); p++) { if(!strcmp((*p)->getName(), name)) { SERVICE s = *(*p)->getService(); return s(w, l); } } return 0; } HANDLE CreateServiceFunction(const char *name, SERVICE pService) { services.push_back(new service(name, pService)); } int ServiceExists(const char *name) { for(list::iterator p = services.begin(); p != services.end(); p++) if(!strcmp((*p)->getName(), name)) return 1; return 0; } SERVICE GetPluginInfoList(WPARAM, LPARAM) { list *pluginInfoList = new list; for(list::iterator p = plugins.begin(); p != plugins.end(); p++) pluginInfoList->push_back((*p)->getPluginInfo()); return (SERVICE)pluginInfoList; //is it right ? } SERVICE Test(WPARAM, LPARAM) { MessageBoxA(0, "Test service working", "INFO", MB_OK); return 0; }