快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
codeblocks-8.02
vs2008
欢迎转载,但请保留作者信息
code::blocks将IDE中的对象分成几类,每类对象都有不同的参数,c::b很自然地考虑用一个xml文件来描述它们,这就是*.conf文件。
当c::b启动时,将读取这个配置文件:
CfgMgrBldr::CfgMgrBldr() : doc(0), volatile_doc(0), r(false)
{
TiXmlBase::SetCondenseWhiteSpace(false);
wxString personality(Manager::Get()->GetPersonalityManager()->GetPersonality());
if(personality.StartsWith(_T("http://")))
{
SwitchToR(personality);
return;
}
cfg = FindConfigFile(personality + _T(".conf"));
if(cfg.IsEmpty())
{
cfg = wxStandardPathsBase::Get().GetUserDataDir() + wxFILE_SEP_PATH + personality + _T(".conf");
doc = new TiXmlDocument();
doc->InsertEndChild(TiXmlDeclaration("1.0", "UTF-8", "yes"));
doc->InsertEndChild(TiXmlElement("CodeBlocksConfig"));
doc->FirstChildElement("CodeBlocksConfig")->SetAttribute("version", CfgMgrConsts::version);
return;
}
SwitchTo(cfg);
}
在默认情况下,personality将是一个叫“default”的字符串,因此下面相当于调用
cfg = FindConfigFile("default.conf");
来查找配置文件的位置。看看这个函数:
wxString CfgMgrBldr::FindConfigFile(const wxString& filename)
{
wxPathList searchPaths;
wxString u(wxStandardPathsBase::Get().GetUserDataDir() + wxFILE_SEP_PATH + filename);
wxString e(::DetermineExecutablePath() + wxFILE_SEP_PATH +filename);
if(::wxFileExists(u))
{
return u;
}
if(::wxFileExists(e))
{
ConfigManager::relo = true;
return e;
}
return wxEmptyString;
}
从这里可以很明显看出,c::b优先查找用户个人目录下的default.conf,比如:
x:\Documents and Settings\开发者\Application Data\codeblocks
如果没有查找到则到codeblock.exe所在的目录查找,如果找不到,c::b将自动创建一个配置文件。
既然可以叫default.conf,那么是否可以使用其它的文件名呢?
“default”这个字符串来自于PersonalityManager::GetPersonality,看看:
const wxString PersonalityManager::GetPersonality()
{
return pers;
}
这里pers是PersonalityManager的一个成员,且可以通过PersonalityManager::SetPersonality更改:
void PersonalityManager::SetPersonality(const wxString& personality, bool createIfNotExist)
{
pers = personality;
}
查找SetPersonality在文件中的位置,可以发现有这样的调用:
void CodeBlocksApp::SetupPersonality(const wxString& personality)
{
if (personality.CmpNoCase(_T("ask")) == 0)
{
CompileTimeAssertion<wxMinimumVersion<2,5>::eval>::Assert(); // just to make sure: wxWidgets 2.4 is dead
const wxArrayString items(Manager::Get()->GetPersonalityManager()->GetPersonalitiesList());
wxSingleChoiceDialog dlg(0, _("Please choose which personality (profile) to load:"),
_("Personalities (profiles)"),
items);
if (dlg.ShowModal() == wxID_OK)
Manager::Get()->GetPersonalityManager()->SetPersonality(dlg.GetStringSelection());
}
else
{
Manager::Get()->GetPersonalityManager()->SetPersonality(personality, true);
}
}
再查SetupPersonality:
int CodeBlocksApp::ParseCmdLine(MainFrame* handlerFrame)
{
// code shamelessely taken from the console wxWindows sample :)
bool filesInCmdLine = false;
#if wxUSE_CMDLINE_PARSER
wxCmdLineParser& parser = *Manager::GetCmdLineParser();
……………………….
if (parser.Found(_T("personality"), &val) ||
parser.Found(_T("profile"), &val))
{
SetupPersonality(val);
}
………………………
#endif // wxUSE_CMDLINE_PARSER
return filesInCmdLine ? 1 : 0;
}
也就是说,可以通过personality或者profile两个命令行参数来进行配置文件的选择。
code::blocks在vs2008下编译的一个问题(2009-5-3)
codeblocks中plugin的实现(2008-9-9)