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;
}