我是一个C++ Builder + VCL编程新手。

我想,学习一门新的语言或熟悉一个新的架构,最脚踏实地的研修方法就是实际操练,而实际操练最好的方法,莫过于亲自接触源代码,而关于代码的学习,非常重要的一点就是,将那些现成的高质量的代码“拿来” —— 琢磨、临摹、调试、扩展。

现在,我选择了CodeGear C++ Builder 2007作为我学习和实践C++ Builder + VCL的平台。

我下载了一些C++ Builder源程序。这些源程序,都是BCB 6开发的。那么,问题就来了……

打开这些源程序包,里面有一些文件,它们的扩展名分别是:

bpr、cpp、h、dfm、res等等。

根据我粗略的理解,这些文件是这样的:

bpr —— 源程序的项目文件;
cpp —— C++源代码文件;
h —— C++头文件;
dfm —— 跟GUI程序的窗体有关的源代码;
res —— 项目的资源文件。
那么,对于C++ Builder这个IDE来说,打开一个新的程序项目,应该由打开项目文件开始。那么,在CodeGear C++ Builder 2007(下简称“2007”)打开某个BCB 6源程序的bpr文件,马上就报Error了:

OLE error 80131052, ClassID: {某个GUID值}

而详细信息是形如这样的:

[200446D4]{rtl100.bpl } ComObj.OleError (Line 1269, "common\ComObj.pas" + 1) + $11
[200446E3]{rtl100.bpl } ComObj.OleCheck (Line 1276, "common\ComObj.pas" + 0) + $7
[200449AC]{rtl100.bpl } ComObj.CreateComObject (Line 1364, "common\ComObj.pas" + 2) + $1A
[220480AA]{bcbide100.bpl} Borland_Studio_Toolsets_TLB.CoBuildOptionExplorer.Create (Line 1880, "Borland_Studio_Toolsets_TLB.pas" + 1) + $8
[2204ECB3]{bcbide100.bpl} BOEOptsIntf.BOE (Line 296, "BOEOptsIntf.pas" + 3) + $8
[220C2EF9]{bcbide100.bpl} CppProjectImport.TCppProjectConverter.CreateNewProjectNode (Line 608, "CppProjectImport.pas" + 3) + $39
……
……
……

开来,BCB6的源程序,至少是项目文件,无法被2007里正确认可。那么,试着从项目(bpr)文件入手,看看是否有什么可行的办法。用文本编辑器软件打开该bpr文件 ——

检查所有明显的与BCB 6有关的字段:

<MACROS>里面:

    <VERSION value="BCB.06.00"/> <INCLUDEPATH value="……;;……;$(BCB)\include;$(BCB)\include\vcl;……\C++_Builder_VCL\SUIPack_v6.2\Include\BCB6"/> <LIBPATH value="……;;……;$(BCB)\lib\obj;$(BCB)\lib;;……\C++_Builder_VCL\SUIPack_v6.2\Source"/>


<OPTIONS>里面:

    <IDLCFLAGS value="-I……; -I…… -I$(BCB)\include -I$(BCB)\include\vcl -I……\C++_Builder_VCL\SUIPack_v6.2\Include\BCB6 -src_suffix cpp -D_DEBUG -boa"/> <CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c -tW -tWM"/>

好,我来设置将其中的相关路径与目标,试着逐个改为2007的 —— 问题来了,怎么改?不能盲目地改。不妨这样吧 —— 用C++ Builder 2007编制一个VCL程序,内容就是一个空空的窗体,Make一下、Build一下(此时Make和Build几乎没啥区别),再保存一下项目(cbproj)文件。

观察一下这个由2007生成的cbproj文件,会发现它的内在格式与BCB 6的bpr文件的完全不同,不过里面应该蕴含着有用的信息,可以拿来借鉴。试着改……

<VERSION/>怎么改?
随便吧:
<VERSION value="I DO NOT KNOW"/>

<INCLUDEPATH/>呢?
这样吧:
<INCLUDEPATH value="$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;……"/>

<LIBPATH/>呢?
这样吧:
<LIBPATH value="$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;……/>

<IDLCFLAGS/>呢?
这样吧:
<IDLCFLAGS value=" -I$(BDS)\include -I$(BDS)\include\dinkumware -I$(BDS)\include\vcl -I$(BDS)\lib\psdk -src_suffix cpp -D_DEBUG -boa"/>

<CFLAG1/>呢?
真不知道了……置空吧。

保存该bpr文件,再由2007打开它,结果还是报Error:

Could not convert variant of type (Null) into type (String)

详细信息形如:
[2001D313]{rtl100.bpl } Variants.VarCastError (Line 530, "sys\variants.pas" + 1) + $4A
[20021397]{rtl100.bpl } Variants.@VarToLStr (Line 2292, "sys\variants.pas" + 6) + $8
[220A7E83]{bcbide100.bpl} CppProjOpts.ReadMakeSymsFromNode (Line 6694, "CppProjOpts.pas" + 6) + $16
[220A7F9F]{bcbide100.bpl} CppProjOpts.TMakeSymsConverter.ReadFromXml (Line 6704, "CppProjOpts.pas" + 6) + $14
[220C4CAE]{bcbide100.bpl} CppProjectImport.TCppProjectConverter.XMLBprToBdsProj (Line 998, "CppProjectImport.pas" + 11) + $11
[220C0DF0]{bcbide100.bpl} CppProjectImport.TCppProjectConverter.ConvertOldCBuilderProject (Line 170, "CppProjectImport.pas" + 20) + $8
……
……
……

唉……实在不知道怎么办了……

特向这里的各位大虾求教:BCB 6的源程序,究竟要如何转换,才能在C++ Builder 2007里开发?

都说“C++ Builder‘向下兼容’”——怎么才能实现这种兼容性呢?

请大虾们不妨从基本的讲起吧,比如关于VCL编程的架构性的基础。

恳请大虾不吝赐教!

非常感谢!