bool ArchivePlugin::Initialize ( const char *lpModuleName, const char *lpLanguage ) { m_hModule = LoadLibrary (lpModuleName); m_pfnGetMsgThunk = NULL; m_pLanguageStrings = NULL; m_nStringsCount = 0; if ( m_hModule ) { m_lpModuleName = StrDuplicate (lpModuleName); // global m_pfnPluginEntry = (PLUGINENTRY)GetProcAddress (m_hModule, "PluginEntry"); if ( m_pfnPluginEntry ) { StartupInfo _si; FARSTANDARDFUNCTIONS _FSF; Helpers _HF; _si.Info = Info; _HF.Allocate = Allocate; _HF.Free = Free; _FSF = FSF; _si.Info.FSF = &_FSF; _si.HF = _HF; m_pfnGetMsgThunk = CreateThunkFastEx(this, (void *)GetMsgThunk); strcpy (_si.Info.ModuleName, lpModuleName); memcpy (&_si.Info.GetMsg, &m_pfnGetMsgThunk, sizeof(void*)); ReloadLanguage (lpLanguage); m_pfnPluginEntry (FID_INITIALIZE, (void*)&_si); memset (&m_ArchivePluginInfo, 0, sizeof (ArchivePluginInfo)); m_pfnPluginEntry (FID_GETARCHIVEPLUGININFO, (void*)&m_ArchivePluginInfo); return true; } } return false; }
bool ArchiveModule::Load(const TCHAR *lpModuleName, const TCHAR *lpLanguage) { m_strModuleName = lpModuleName; m_hModule = LoadLibrary(lpModuleName); if ( m_hModule ) { // global m_pfnModuleEntry = (MODULEENTRY)GetProcAddress(m_hModule, "ModuleEntry"); if ( m_pfnModuleEntry ) { StartupInfo _si; FARSTANDARDFUNCTIONS _FSF; _si.Info = Info; _FSF = FSF; _si.Info.FSF = &_FSF; #ifdef UNICODE _si.Info.ModuleName = lpModuleName; #else _tcscpy (_si.Info.ModuleName, lpModuleName); #endif _si.Info.ModuleNumber = (INT_PTR)this; _si.Info.GetMsg = GetMsg; ReloadLanguage(lpLanguage); //хм, а не рано ли if ( m_pfnModuleEntry(FID_INITIALIZE, (void*)&_si) == NAERROR_SUCCESS ) { ArchiveModuleInfo info; memset(&info, 0, sizeof(ArchiveModuleInfo)); if ( m_pfnModuleEntry(FID_GETARCHIVEMODULEINFO, (void*)&info) == NAERROR_SUCCESS ) { m_dwFlags = info.dwFlags; m_uid = info.uid; for (unsigned int i = 0; i < info.uPlugins; i++) m_pPlugins.add(new ArchivePlugin(this, &info.pPlugins[i])); return true; } } } } return false; }