`
yangzb
  • 浏览: 3473336 次
  • 性别: 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中文语言包

    codeblocks中文语言包,不用安装,就可以把codeblocks变成中文的

    CodeBlocks 中文包 20.03

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

    codeblocks 中文语言包

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

    CodeBlocks13.12中文汉化MO包

    CodeBlocks13.12中文汉化MO包

    codeblocks 中文完整文档教程

    这份资料是codeblocks 中文完整文档教程,很适合刚刚接触codeblocks的程序员

    CodeBlocks13.12 中文包

    CodeBlocks13.12 中文包 使用方法:下载后解压缩,将里面的locale文件夹复制到 CodeBlocks安装路径下的 share\CodeBlocks 下面

    codeblocks中文包

    codeblocks13.12中文语言包,支持各个平台上的汉化(包括windows,linux,osx,等平台),汉化帮助参考readme.txt

    codeblocks10.05 中文包

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

    codeblocks8.02 最新中文包 8.02

    codeblocks 8.02 最新中文包

    wxWidgets在codeblocks中的配置

    wxWidgets在codeblocks中的配置

    codeblocks 中文包

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

    codeblocks 10.05 中文语言包

    如果目录不存在的话自己创建一下,再解压到里面,第二种情况是在codeblocks 中没有选择中文语言,所以依然是英文界面 压缩包中的文件一定要解压到这个目录 \CodeBlocks\share\CodeBlocks\locale 如果上面的目录不...

    codeblocks

    codeblocks 是一款不错的编程软件

    CodeBlocks-8.02 中文包

    CodeBlocks-8.02 中文包 更新到09年02月,基本上都汉化了

    CodeBlocks中文语言包

    CodeBlocks的中文语言包,确定CodeBlocks_8.02可用。

    一个用codeblocks实现的具有通用框架线程池

    本人花了两天时间编写的线程池,采用了linux通用的线程池框架,在windows上用codeblocks实现的。里面包含了测试代码,集成job的测试类代码和main中的测试代码,健壮性很好,还会继续优化。

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

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

    CodeBlocks17.02汉化包

    在share文件夹中有codeblocks文件夹,再进入codeblocks文件夹,新建一个新的文件夹locale 点击新的文件夹locale进入,再次新的文件夹并命名为zh_CN。 最后,将codeblocks汉化包复制到新的文件夹zh_CN中 然后,打开...

    Linux中CodeBlocks开发环境全套RPM包

    Linux环境下的CodeBlocks开发工具,全套。 在OpenSUSE Linux下测试通过。 全部由RPM包构成,其他版本的Linux也可以尝试。 安装顺序如下: ...注意:此工具只是IDE,安装之前确保系统中含有GCC和GDB。

    codeblocks 手册

    codeblocks 可用于 fortran c c++ 等语言的开发

Global site tag (gtag.js) - Google Analytics