⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pluginmanager.cpp

📁 介绍c++游戏编程
💻 CPP
字号:

#include "stdafx.h"
#include "PluginManager.h"
#include "Plugin.h"
#include "MainFrame.h"
#include <io.h>


using std::string;


PluginManager * PluginManager::s_pInstance = NULL;



PluginManager::PluginManager(){}

PluginManager & PluginManager::GetInstance()
{
    if ( s_pInstance == NULL )
        s_pInstance = new PluginManager();

    return *s_pInstance;
}


void PluginManager::LoadPlugins ( const string & strDir )
{
    std::vector<string> filenames;
    GetFilenames(strDir, filenames);

    std::vector<std::string>::const_iterator it;
    for (it = filenames.begin(); it != filenames.end(); ++it)
    {
        const string & filename = *it;
        string & fullName = strDir + string("\\") + filename;
        LoadPlugin (fullName);
    }
}


void PluginManager::GetFilenames ( const string & dir, 
                                  std::vector<string> & filenames ) const
{
    string mask = dir + string("\\*.plug");

    struct _finddata_t fileinfo;
    long handle = ::_findfirst(mask.c_str(), &fileinfo);
    long file   = handle;

	while (file >= 0)
	{
        filenames.push_back(string(fileinfo.name));
        file = ::_findnext(handle, &fileinfo);
	}

    ::_findclose(handle);
}


bool PluginManager::LoadPlugin ( const string & filename )
{
    HMODULE hDll = ::LoadLibrary (filename.c_str());
    if ( hDll == NULL )
    {
        LPVOID lpMsgBuf;
        ::FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM | 
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
            (LPTSTR) &lpMsgBuf,
            0,
            NULL 
        );

        ::OutputDebugString((char *)lpMsgBuf);

        LocalFree( lpMsgBuf );
        return false;
    }


    CREATEPLUGIN pFunc = (CREATEPLUGIN)::GetProcAddress (hDll, _T("CreatePlugin"));
    if ( pFunc == NULL )
        return false;


    IPlugin * pPlugin = pFunc(*this);
    if ( pPlugin == NULL )
        return false;


    PluginInfo info;
    info.pPlugin = pPlugin;
    info.hDll    = hDll;

    m_plugins.push_back(info);


    MainFrame * pMainFrame = static_cast<MainFrame*>(::AfxGetMainWnd());
    pMainFrame->AddExporter(pPlugin->GetExportName());

    return true;
}


void PluginManager::UnloadAll ( void )
{
    MainFrame * pMainFrame = static_cast<MainFrame*>(::AfxGetMainWnd());

    std::vector<PluginInfo>::iterator it;
    for (it=m_plugins.begin(); it!=m_plugins.end(); ++it)
    {
        PluginInfo & info = *it;
            
        pMainFrame->RemoveExporter(info.pPlugin->GetExportName());

        delete info.pPlugin;
        ::FreeLibrary (info.hDll);
    }

    m_plugins.clear();
}


int PluginManager::GetNumPlugins ( void ) const
{
    return m_plugins.size();
}


IPlugin * PluginManager::GetPlugin ( int nIndex )
{
    if ( nIndex < 0 || nIndex >= GetNumPlugins() )
        return NULL;

    return m_plugins[nIndex].pPlugin;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -