//
// externfunc
// 公開関数。DLL ロード後最初に実行されることを期待している。
// BASE_DLL のライブラリを実体化し、その後自身を実体化する
//

#include <tchar.h>

#include "tstring.h"
#include "scci.h"
#include "udpl_dll.h"
#include "udplscci.h"

// global value
extern std::tstring strDllPath;	// dll のパス

//
// 外部公開関数
// BASE_DLL のライブラリを実体化した上で、クラスを実体化してポインタを返す
//
extern "C" SoundInterfaceManager* __stdcall getSoundInterfaceManager(void)
{
	// DLL 検索パスを空にする
	//SetDllDirectory(_T(""));

	//
	// udpl manager のインスタンス化
	//
	std::tstring dllPath = strDllPath + dllName;

	HMODULE udplhdl = nullptr;
	udplhdl = ::LoadLibrary(dllPath.c_str());
	if (udplhdl == nullptr) {
		return nullptr;
	}

	UDPLFUNC getInstance = (UDPLFUNC)GetProcAddress(udplhdl, "getManager");
	if (getInstance == nullptr) {
		return nullptr;
	}

	UdplManager *udplManager = getInstance();

	//
	// この DLL ライブラリの実体化
	//
	SoundInterfaceManager_udpl *pManager = nullptr;		// マネージャー
	pManager = new SoundInterfaceManager_udpl(udplhdl, udplManager, nullptr, nullptr);
	if (pManager == nullptr) {
		udplManager->suicide();
		::FreeLibrary(udplhdl);
		return nullptr;
	}
	return pManager;
}
