86 lines
2.0 KiB
C++
86 lines
2.0 KiB
C++
|
//
|
||
|
// Language plugin support
|
||
|
//
|
||
|
#include "VirtuaNESres.h"
|
||
|
|
||
|
#include "Pathlib.h"
|
||
|
#include "DebugOut.h"
|
||
|
|
||
|
#include "Plugin.h"
|
||
|
|
||
|
typedef INT (__cdecl *GETVLPVERSION)();
|
||
|
typedef void (__cdecl *GETVLPLANGUAGE)( LPSTR );
|
||
|
typedef LCID (__cdecl *GETVLPLOCALEID)();
|
||
|
|
||
|
INT CPlugin::m_PluginID = 0;
|
||
|
INT CPlugin::m_PluginNum = 0;
|
||
|
CPlugin::PLUGIN CPlugin::m_Plugin[PLUGIN_MAX];
|
||
|
|
||
|
HINSTANCE CPlugin::LoadPlugin()
|
||
|
{
|
||
|
return LoadPluginID( m_PluginID );
|
||
|
}
|
||
|
|
||
|
HINSTANCE CPlugin::LoadPluginID( INT nID )
|
||
|
{
|
||
|
return ::LoadLibrary( m_Plugin[nID].Path );
|
||
|
}
|
||
|
|
||
|
BOOL CPlugin::FindPlugin( LPCSTR lpModulePath )
|
||
|
{
|
||
|
m_PluginNum = 0;
|
||
|
|
||
|
string Path = CPathlib::MakePath( lpModulePath, "*.vlp" );
|
||
|
|
||
|
WIN32_FIND_DATA find;
|
||
|
HANDLE hFind = ::FindFirstFile( Path.c_str(), &find );
|
||
|
if( hFind == INVALID_HANDLE_VALUE )
|
||
|
return FALSE;
|
||
|
|
||
|
HINSTANCE hDLL;
|
||
|
GETVLPVERSION GetVlpVersion = NULL;
|
||
|
GETVLPLANGUAGE GetVlpLanguage = NULL;
|
||
|
GETVLPLOCALEID GetVlpLocaleID = NULL;
|
||
|
|
||
|
BOOL bFind = TRUE;
|
||
|
while( bFind ) {
|
||
|
if( (hDLL = ::LoadLibrary( find.cFileName )) ) {
|
||
|
GetVlpVersion = (GETVLPVERSION) ::GetProcAddress( hDLL, "GetVlpVersion" );
|
||
|
GetVlpLanguage = (GETVLPLANGUAGE)::GetProcAddress( hDLL, "GetVlpLanguage" );
|
||
|
GetVlpLocaleID = (GETVLPLOCALEID)::GetProcAddress( hDLL, "GetVlpLocaleID" );
|
||
|
|
||
|
if( !(!GetVlpVersion || !GetVlpLanguage || !GetVlpLocaleID) ) {
|
||
|
INT ver = GetVlpVersion();
|
||
|
|
||
|
if( ver >= VIRTUANES_PLUGIN_VERSION ) {
|
||
|
m_Plugin[m_PluginNum].LocaleID = GetVlpLocaleID();
|
||
|
string Path = CPathlib::MakePath( lpModulePath, find.cFileName );
|
||
|
::strcpy( m_Plugin[m_PluginNum].Path, Path.c_str() );
|
||
|
GetVlpLanguage( m_Plugin[m_PluginNum].Language );
|
||
|
m_PluginNum++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
::FreeLibrary( hDLL );
|
||
|
}
|
||
|
|
||
|
bFind = ::FindNextFile( hFind, &find );
|
||
|
|
||
|
if( m_PluginNum >= PLUGIN_MAX )
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
::FindClose( hFind );
|
||
|
|
||
|
LCID lcid = ::GetUserDefaultLCID();
|
||
|
for( INT no = 0; no < m_PluginNum; no++ ) {
|
||
|
if( m_Plugin[no].LocaleID == lcid ) {
|
||
|
m_PluginID = no;
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|