`
yangzb
  • 浏览: 3503389 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

codeblocks中plugin的实现

    博客分类:
  • C++
阅读更多

快乐虾 http://blog.csdn.net/lights_joy/ lights@hb165.com

本文适用于

codeblocks-8.02

vs2005

 

 

 

1.1     Plugin 加载

Codeblocks plugin 放在可执行文件目录下的 share\CodeBlocks\plugins 子目录中,全部以 DLL 的形式存在。在 codeblock 启动时会调用如下函数:

int PluginManager::ScanForPlugins( const wxString& path)

{

………………………………… ..

    wxDir dir(path);

    wxString filename;

    wxString failed;

    bool ok = dir.GetFirst(&filename, PluginsMask, wxDIR_FILES);

    while (ok)

    {

…………………… .

        // load manifest

        m_pCurrentlyLoadingManifestDoc = 0;

        if (ReadManifestFile(filename))

        {

            if (LoadPlugin(path + _T( '/' ) + filename))

                ++count;

            else

                failed << _T( '\n' ) << filename;

        }

        delete m_pCurrentlyLoadingManifestDoc;

        m_pCurrentlyLoadingManifestDoc = 0;

        ok = dir.GetNext(&filename);

}

………………………………… ..

}

在上述代码中,将首先读取与 dll 同名的 manifest ,其实它就是一个放在 share/codeblocks 子目录下的同名 zip 文件,这个 zip 文件中两个文件: manifest.xml configuration.xrc ,其实这两个文件都是 XML 文档, manifest.xml 描述了这个插件的功能,作者等信息,而另一个文件则是一些配置信息。

在读取 manifest 成功后将调用 LoadPlugin 函数:

bool PluginManager::LoadPlugin( const wxString& pluginName)

{

    // clear registration temporary vector

    m_RegisteredPlugins.clear();

 

    // load library

    m_CurrentlyLoadingFilename = pluginName;

    m_pCurrentlyLoadingLib = LibLoader::LoadLibrary(pluginName);

    if (!m_pCurrentlyLoadingLib->IsLoaded())

    {

        Manager::Get()->GetLogManager()->LogError(F(_T( "%s: not loaded (missing symbols?)" ), pluginName.c_str()));

        LibLoader::RemoveLibrary(m_pCurrentlyLoadingLib);

        m_pCurrentlyLoadingLib = 0;

        m_CurrentlyLoadingFilename.Clear();

        return false ;

    }

 

    // by now, the library has loaded and its global variables are initialized.

    // this means it has already called RegisterPlugin()

    // now we can actually create the plugin(s) instance(s) :)

 

    // try to load the plugin(s)

    std::vector<PluginRegistration>::iterator it;

    for (it = m_RegisteredPlugins.begin(); it != m_RegisteredPlugins.end(); ++it)

    {

        PluginRegistration& pr = *it;

        cbPlugin* plug = 0L;

        try

        {

            plug = pr.createProc();

        }

        catch (cbException& exception)

        {

            exception.ShowErrorMessage( false );

             continue ;

        }

 

        // all done; add it to our list

        PluginElement* plugElem = new PluginElement;

        plugElem->fileName = m_CurrentlyLoadingFilename;

        plugElem->info = pr.info;

        plugElem->library = m_pCurrentlyLoadingLib;

        plugElem->freeProc = pr.freeProc;

        plugElem->plugin = plug;

        m_Plugins.Add(plugElem);

 

        SetupLocaleDomain(pr.name);

 

        Manager::Get()->GetLogManager()->DebugLog(F(_T( "%s: loaded" ), pr.name.c_str()));

    }

 

    if (m_RegisteredPlugins.empty())

    {

        // no plugins loaded from this library, but it's not an error

        LibLoader::RemoveLibrary(m_pCurrentlyLoadingLib);

    }

    m_pCurrentlyLoadingLib = 0;

    m_CurrentlyLoadingFilename.Clear();

    return true ;

}

这个函数首先调用 LibLoader::LoadLibrary 加载 DLL ,实际上它就是使用 LoadLibrary 这个 API 来加载 DLL

在加载完成后,按照注释的说明,这个 DLL 中应该调用 RegisterPlugin 函数进行自我注册,这其中当然包括创建实例这样回调函数,然后上述函数很自然地使用这样的回调函数创建 Plugin 的实例。然后用一个 PluginElement 来描述它,这个 plugElem 将用于主界面的菜单等位置。

从上述代码还可以看出,插件至少应该能创建一个 cbPlugin 的实例。

1.2     插件注册

从调用过程的注释可以知道,在加载 DLL 时,它应该能够调用 RegisterPlugin codeblock 进行注册,下面以 astyle 这个插件为例看看它的注册过程。

在这个插件中定义了一个全局变量:

namespace

{

    PluginRegistrant<AStylePlugin> reg(_T( "AStylePlugin" ));

}

除此之外没有其它东西可以在 DLL 加载时执行代码,看看 PluginRegistrant 这个类:

/** @brief Plugin registration object.

    *

  * Use this class to register your new plugin with Code::Blocks.

  * All you have to do is instantiate a PluginRegistrant object.

  * @par

  * Example code to use in one of your plugin's source files (supposedly called "MyPlugin"):

  * @code

  * namespace

  * {

  *     PluginRegistrant<MyPlugin> registration("MyPlugin");

  * }

  * @endcode

  */

template < class T> class PluginRegistrant

{

    public :

        /// @param name The plugin's name.

        PluginRegistrant( const wxString& name)

        {

             Manager::Get()->GetPluginManager()->RegisterPlugin(name, // plugin's name

                                                                &CreatePlugin, // creation

                                                                &FreePlugin, // destruction

                                                                &SDKVersion); // SDK version

        }

 

        static cbPlugin* CreatePlugin()

        {

            return new T;

        }

 

        static void FreePlugin(cbPlugin* plugin)

        {

            delete plugin;

        }

 

        static void SDKVersion( int * major, int * minor, int * release)

        {

            if (major) *major = PLUGIN_SDK_VERSION_MAJOR;

            if (minor) *minor = PLUGIN_SDK_VERSION_MINOR;

            if (release) *release = PLUGIN_SDK_VERSION_RELEASE;

        }

};

由此可见,在主程序加载 DLL 后还将调用 PluginRegistrant ::CreatePlugin 这个回调函数,而这个回调函数将创建一个 AStylePlugin 的实例。

1.3     Plugin 功能实现

仍以 astyle 为例进行分析。 Codeblocks plugin 分为几类:

cbCompilerPlugin

cbDebuggerPlugin

cbToolPlugin

cbMimePlugin

cbCodeCompletionPlugin

cbWizardPlugin

astyle 要完成代码格式化的功能,因而它选择了 cbToolPlugin 进行扩展:

class AStylePlugin : public cbToolPlugin

{

  public :

    AStylePlugin();

    ~AStylePlugin();

    int Configure();

    int GetConfigurationGroup() const { return cgEditor; }

    cbConfigurationPanel* GetConfigurationPanel(wxWindow* parent);

    int Execute();

    void OnAttach(); // fires when the plugin is attached to the application

    void OnRelease( bool appShutDown); // fires when the plugin is released from the application

};

呵呵,看着好像挺简单的。

 

 

分享到:
评论

相关推荐

    codeblocks中文语言包

    1. 找到CodeBlocks的安装目录,通常在Windows系统中位于"C:\Program Files\CodeBlocks"。 2. 进入"share\codeblocks\locale"目录,这里存放着CodeBlocks的各种语言文件。 3. 备份原有的英文语言文件,通常名为...

    codeblocks中文包

    总的来说,"codeblocks中文包"是CodeBlocks用户特别是中文用户的重要辅助工具,它提高了开发效率,降低了学习曲线,是多平台开发环境中不可或缺的一部分。正确安装和使用此汉化包,将有助于提升编程体验,让开发者更...

    Codeblocks中文语言包

    在Codeblocks中,使用中文语言包可以让中国用户更方便地进行编程工作,避免了因语言障碍可能带来的理解困难。这个压缩包提供的就是Codeblocks的中文语言包,用于将Codeblocks的界面翻译成简体中文。 "安装说明.txt...

    CodeBlocks13.12 中文包

    CodeBlocks是一款开源、免费的C++集成开发环境(IDE),专为C++设计,支持Windows、Linux和Mac OS等操作系统。13.12版本是它的一个历史...正确安装和应用汉化包,能让用户更加顺畅地在CodeBlocks中进行C++开发工作。

    codeblocks 中文语言包

    在目录下/usr/share/codeblocks/新建locale文件夹然后把 codeblocks.mo 拷贝到locale文件夹内。重现启动codeblocks 自动转换为中文界面。 如果是windows上,则在codeblocks的安装目录的\share\CodeBlocks\下建立...

    CodeBlocks 中文包 20.03

    CodeBlocks 中文包 20.03 解压到 cb安装目录\share\CodeBlocks 解压后正确文件路径为::cb安装目录\share\CodeBlocks\locale\zh_CN\zh_CN.mo

    【Windows】【CodeBlocks中文插件】locale[解压到share文件夹].zip

    在CodeBlocks中,安装locale插件可以将IDE的界面语言转换为中文,这对于中文用户来说是非常友好的,可以降低学习和使用的门槛。 这个压缩包"【Windows】【CodeBlocks中文插件】locale[解压到share文件夹].zip"显然...

    CodeBlocks中文语言包

    总的来说,"CodeBlocks中文语言包"是方便中国用户使用CodeBlocks的重要工具,通过简单的步骤即可实现IDE的中文界面,从而提升编程学习和工作的体验。对于那些刚开始接触编程或者不熟悉英文的用户来说,这是一个非常...

    codeblocks 中文完整文档教程

    9. **实践项目**:通过实际的小型编程项目,比如实现一个简单的计算器或文本编辑器,来巩固所学知识,提升编程技能。 10. **进阶主题**:对于有一定经验的用户,教程可能还会涉及更复杂的主题,如多线程编程、动态...

    CodeBlocks 的 Vim 插件

    CodeBlocks 是一款流行的开源集成开发环境(IDE),它支持多种编程语言,如 C、C++ 和 Fortran。...通过了解其编译和安装过程,以及掌握基本的 Vim 操作,可以在 CodeBlocks 中实现更流畅的开发体验。

    CodeBlocks-8.02 中文包

    在本例中,"locale"可能包含了CodeBlocks 8.02的中文语言包,这些文件按照特定的格式和命名规则组织,如zh_CN(表示简体中文)等,用于替换原英文版中的相应文件,实现界面的汉化。 在安装此中文包时,用户通常需要...

    wxWidgets在codeblocks中的配置

    标题与描述:“wxWidgets在codeblocks中的配置” 这部分标题与描述着重强调了如何在CodeBlocks这一集成开发环境(IDE)中配置wxWidgets。这表明文章的主要目的是指导开发者如何设置他们的开发环境,以便能够使用...

    codeblocks10.05 中文包

    codeblocks10.05 中文包 Windows、Linux和Mac平台通用,放在share\CodeBlocks\locale\zh_CN目录下,必要时手动建立locale\zh_CN目录。然后在Codeblocks里设置国际化。

    codeblocks的中文包及安装傻瓜式说明

    5. **粘贴到CodeBlocks安装目录**:将“chinese_simplified”文件夹粘贴到你找到的CodeBlocks安装目录下的“locales”子目录中。如果“locales”文件夹不存在,就需要手动创建。 6. **修改CodeBlocks配置**:启动...

    codeblocks工程转makefile

    转换后的`makefile`能够被`make`命令解析并执行编译任务,这对于理解项目结构、自动化构建或在没有CodeBlocks的环境中编译项目非常有用。 描述中提到,转换支持单个工程转换和工作区转换。单个工程转换通常涉及一个...

    codeblocks 中文包

    C++ IDE: codeblocks 的中文语言包及中、英文对照的每日提示。解压出来的codeblocks.mo放到 %CODEBLOCKS%\share\CodeBlocks\locale\zh_CN\目录下就是中文IDE了;解压出来的tips.txt替换%CODEBLOCKS%\share\CodeBlocks...

    codeblocks 8.02中文语言包.rar

    这个“codeblocks 8.02中文语言包.rar”压缩包是为CodeBlocks 8.02版本提供的中文语言支持,帮助用户将IDE的界面语言切换到简体中文,使得在编程过程中可以更方便地理解各种菜单和提示信息。 安装使用方法通常包含...

    codeblocks.mo(中文补丁).zip

    总之,"codeblocks.mo(中文补丁).zip" 是为了让CodeBlocks适应中国用户而设计的一个实用工具,通过简单的步骤即可实现CodeBlocks的界面汉化。这个补丁的出现,体现了开源社区的协作精神,也展示了技术如何更好地服务...

Global site tag (gtag.js) - Google Analytics