#include"CDllWrapper.h"
#include"../Debug/cassert.h"
#include"../Debug/cwarning.h"
#include"../CString.h"

namespace Maid
{
/*!
 	@class	CDllWrapper CDLLWrapper.h
 	@brief	DLL 操作のラッパクラス
 */


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 */
CDllWrapper::CDllWrapper()
:m_hDll(NULL)
{

}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! デストラクタ
/*!
 */
CDllWrapper::~CDllWrapper()
{
	Free();
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! DLL の読み込み
/*!
 	@param	DllName [i ]	読み込むＤＬＬ名
 
	@exception CExceptionNotDLL オープンに失敗した場合
 */
void CDllWrapper::Load( const mstring& DllName )
{
	Free();

	const MySTL::string sjis_name = CString::ConvertMAIDtoSJIS(DllName);

	HINSTANCE hInst  = ::LoadLibrary( sjis_name.c_str() );

	if( hInst==NULL ) 
	{
		MAID_ASSERT( true, DllName << "が見つかりません" );
		MAID_THROWEXCEPTION( DllName + MAIDTEXT("が見つかりません") );
	}

	m_DllName = DllName;
	m_hDll    = hInst;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 関数アドレスの取得
/*!
 *	\param	FunctionName [i ]	取得したい関数名
 *
 *	\return 関数がみつかったらそのアドレス
\n			みつからなかったらＮＵＬＬ
 */
FARPROC	CDllWrapper::GetProcAddress( const mstring& FunctionName ) const
{
	MAID_ASSERT( m_hDll==NULL, "ＤＬＬを読み込んでいません" );
	if( m_hDll==NULL ) { return NULL; }

	const MySTL::string sjis_name = CString::ConvertMAIDtoSJIS(FunctionName);

	return ::GetProcAddress( m_hDll, sjis_name.c_str() );
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 読み込んだＤＬＬの開放
/*!
 */
void CDllWrapper::Free()
{
	if( m_hDll!=NULL )
	{
		::FreeLibrary(m_hDll);
		m_hDll = NULL;
	}
}

}