#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); 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++) { cout<<"Loaded plugin: "<<(*p)->getName()<<'\n'; (*p)->getFuncs().load(&link); } 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"); 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; } 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); } INT_PTR CallService(const char *name, WPARAM w, LPARAM l) { } HANDLE CreateServiceFunction(const char *name, SERVICE pService) { } int ServiceExists(const char *name) { }