#include <iostream>
#include <windows.h>

class MyPluginInterface
{
public:
	virtual float GetVersion(void)=0;

	friend MyPluginInterface* MakeInstance(void);
	friend void ReleaseInstance(MyPluginInterface* instance);
};

typedef MyPluginInterface* (*API_MakeInstance)(void);
typedef void (*API_ReleaseInstance)(MyPluginInterface* instance);

using std::cout;
using std::endl;

int main(void)
{
	HMODULE hmod;
	/* プラグイン内の関数へのポインタ */
	API_MakeInstance MakeInstance;
	/* プラグイン内の関数へのポインタ */
	API_ReleaseInstance ReleaseInstance;

	/* プラグインと関数のロード */
	hmod  = LoadLibrary("Plugin.dll");
	MakeInstance = (API_MakeInstance)GetProcAddress(hmod, "MakeInstance");
	ReleaseInstance = (API_ReleaseInstance)GetProcAddress(hmod, "ReleaseInstance");
	if (MakeInstance != NULL && ReleaseInstance != NULL) {
		MyPluginInterface* mpc; /* プラグイン内のクラスへのポインタ */
		mpc = MakeInstance();
		cout << "Version: " << mpc->GetVersion() << endl;
		ReleaseInstance(mpc);
	}
	/* プラグインの解放 */
	FreeLibrary(hmod);
	return 0;
}
