- 浏览: 3507303 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
快乐虾 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
};
呵呵,看着好像挺简单的。
发表评论
-
使用iconv进行内码转换(Big5->GB2312)
2012-02-26 00:56 3522i conv 是一个通过unicode 作为中间码 ... -
关于IObjectSafety和ActiveX组件的脚本安全
2011-11-17 19:19 3123都说ActiveX 危险,那么 ... -
在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全。你想允许这种交互
2011-11-17 19:09 14847如果采用VC++开发的ActiveX,那么第一次运行的时候,I ... -
如何编写 INF 文件
2011-11-16 14:31 2191INF文件全称Information File文件,是Wino ... -
MINGW GCC 4.3.0 安装与配置(解决CREATEPROCESS问题)
2011-07-28 23:53 4713首先,下载Mingw TDM 4.3.0版本http:// ... -
“没有找到MSVCP90D.dll”的解决办法
2011-04-02 00:21 4720出现这个bug的缘故是 ... -
DSO开发指南晋级(APACHE2.0 MOD 模块开发)
2010-09-23 04:23 2368APACHE2.0 MOD 模块开发 STEP ... -
ubuntu 7.10里装apxs2
2010-09-23 03:43 1988install apache2-prefork-dev ... -
Ubuntu 下安装 Code::Blocks
2010-02-15 23:41 12039在Linux环境下,就不同 ... -
C/C++ IDE Code::Blocks安装过程
2010-02-15 23:27 55481.简介 Code::Blocks,有时 ... -
CodeLite可以媲美Code::Blocks
2010-02-15 21:27 41703CodeLite简单就是为wxWidgets/wxFormBu ... -
编写Apache模块——mod_helloworld
2010-01-02 17:23 3199自Apache2.0以来Apache就是一个开放的平台,开发人 ... -
APR中的单元测试框架:深入分析内部实现
2010-01-02 17:19 1880APR单元测试框架实现的实在简单,除了断言集之外ABTS只向外 ... -
APR中的单元测试框架:初步分析及使用
2010-01-02 17:19 1907我所了解的C的单元测试框架很少,至少我google了一把没有发 ... -
使用apr-util中的DBD API
2010-01-02 17:15 30641. 简介 在Apache2.1版本中引入了DBD ... -
gsoap 的教程和使用
2009-07-09 13:03 309461.1.1 gSOAP 1.1.1 ... -
C++ dlopen mini HOWTO 中译版
2009-06-27 16:09 2486C++ dlopen mini HOWTO 作者 ... -
BEA Tuxedo
2009-04-02 13:44 3145参数纠错 Tuxedo(Transaction for U ...
相关推荐
1. 找到CodeBlocks的安装目录,通常在Windows系统中位于"C:\Program Files\CodeBlocks"。 2. 进入"share\codeblocks\locale"目录,这里存放着CodeBlocks的各种语言文件。 3. 备份原有的英文语言文件,通常名为...
总的来说,"codeblocks中文包"是CodeBlocks用户特别是中文用户的重要辅助工具,它提高了开发效率,降低了学习曲线,是多平台开发环境中不可或缺的一部分。正确安装和使用此汉化包,将有助于提升编程体验,让开发者更...
在Codeblocks中,使用中文语言包可以让中国用户更方便地进行编程工作,避免了因语言障碍可能带来的理解困难。这个压缩包提供的就是Codeblocks的中文语言包,用于将Codeblocks的界面翻译成简体中文。 "安装说明.txt...
CodeBlocks是一款开源、免费的C++集成开发环境(IDE),专为C++设计,支持Windows、Linux和Mac OS等操作系统。13.12版本是它的一个历史...正确安装和应用汉化包,能让用户更加顺畅地在CodeBlocks中进行C++开发工作。
在目录下/usr/share/codeblocks/新建locale文件夹然后把 codeblocks.mo 拷贝到locale文件夹内。重现启动codeblocks 自动转换为中文界面。 如果是windows上,则在codeblocks的安装目录的\share\CodeBlocks\下建立...
CodeBlocks 中文包 20.03 解压到 cb安装目录\share\CodeBlocks 解压后正确文件路径为::cb安装目录\share\CodeBlocks\locale\zh_CN\zh_CN.mo
在CodeBlocks中,安装locale插件可以将IDE的界面语言转换为中文,这对于中文用户来说是非常友好的,可以降低学习和使用的门槛。 这个压缩包"【Windows】【CodeBlocks中文插件】locale[解压到share文件夹].zip"显然...
总的来说,"CodeBlocks中文语言包"是方便中国用户使用CodeBlocks的重要工具,通过简单的步骤即可实现IDE的中文界面,从而提升编程学习和工作的体验。对于那些刚开始接触编程或者不熟悉英文的用户来说,这是一个非常...
9. **实践项目**:通过实际的小型编程项目,比如实现一个简单的计算器或文本编辑器,来巩固所学知识,提升编程技能。 10. **进阶主题**:对于有一定经验的用户,教程可能还会涉及更复杂的主题,如多线程编程、动态...
CodeBlocks 是一款流行的开源集成开发环境(IDE),它支持多种编程语言,如 C、C++ 和 Fortran。...通过了解其编译和安装过程,以及掌握基本的 Vim 操作,可以在 CodeBlocks 中实现更流畅的开发体验。
在本例中,"locale"可能包含了CodeBlocks 8.02的中文语言包,这些文件按照特定的格式和命名规则组织,如zh_CN(表示简体中文)等,用于替换原英文版中的相应文件,实现界面的汉化。 在安装此中文包时,用户通常需要...
标题与描述:“wxWidgets在codeblocks中的配置” 这部分标题与描述着重强调了如何在CodeBlocks这一集成开发环境(IDE)中配置wxWidgets。这表明文章的主要目的是指导开发者如何设置他们的开发环境,以便能够使用...
codeblocks10.05 中文包 Windows、Linux和Mac平台通用,放在share\CodeBlocks\locale\zh_CN目录下,必要时手动建立locale\zh_CN目录。然后在Codeblocks里设置国际化。
5. **粘贴到CodeBlocks安装目录**:将“chinese_simplified”文件夹粘贴到你找到的CodeBlocks安装目录下的“locales”子目录中。如果“locales”文件夹不存在,就需要手动创建。 6. **修改CodeBlocks配置**:启动...
转换后的`makefile`能够被`make`命令解析并执行编译任务,这对于理解项目结构、自动化构建或在没有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版本提供的中文语言支持,帮助用户将IDE的界面语言切换到简体中文,使得在编程过程中可以更方便地理解各种菜单和提示信息。 安装使用方法通常包含...
总之,"codeblocks.mo(中文补丁).zip" 是为了让CodeBlocks适应中国用户而设计的一个实用工具,通过简单的步骤即可实现CodeBlocks的界面汉化。这个补丁的出现,体现了开源社区的协作精神,也展示了技术如何更好地服务...