Xerces3.0.0をC++Builder 2009でビルドする方法

Xerces3.0.0が動くらしいので、試してみた。手順は以下の通り。

  1. インストール先のprojects\Win32\BCB6\MakeBuildDirs.batを実行。
  2. インストール先のprojects\Win32\BCB6\Xerces-allにある、XercesLib.bprをC++Builder2009で読み込む。
  3. プロジェクトを変換して保存。ファイル名はXercesLib.cbprojとなるはず。
  4. XercesLib.cbprojをエディタで編集
    <PropertyGroup Condition="'$(Base)'!=''">
      <NoVCL>true</NoVCL>    ←追加
      (中略)
      <LinkPackageImports>rtl.bpi</LinkPackageImports>  ←LinkPackageImportsタグの値をrtl.bpiのみに。
      (中略)
      <UsePackages>false</UsePackages>  ←UsePackagesタグの値をfalseに。
    </PropertyGroup>

修正したプロジェクトをビルドすればあっさり動作。バイナリはインストール先のBuild\Win32\BCB6の下に、XercesLib.dllとXercesLib.libが生成される。

サンプルコードはこんな感じ。まず、メインで初期化が必要。

#include <xercesc/util/PlatformUtils.hpp>

#pragma link "XercesLib.lib"
using namespace xercesc;

WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
  try {
    XMLPlatformUtils::Initialize(); // 初期化
    Application->Initialize();
    Application->MainFormOnTaskBar = true;
    Application->CreateForm(__classid(TForm1), &Form1);
    Application->Run();
    XMLPlatformUtils::Terminate();  // 終了処理
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
  }
  catch (...)
  {
    try
    {
      throw Exception("");
    }
    catch (Exception &exception)
    {
      Application->ShowException(&exception);
    }
  }
  return 0;
}

実際にパースしてみる

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMNode.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

XERCES_CPP_NAMESPACE_USE

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  xercesc::XercesDOMParser* parser = new XercesDOMParser();

  parser->parse("Test1.xml");

  xercesc_3_0::DOMDocument* doc = parser->getDocument();
  DOMElement* root = doc->getDocumentElement();

  const wchar_t* NodeName = root->getNodeName();

  UnicodeString us(NodeName);
  ShowMessage(us);

  delete parser;
}
//---------------------------------------------------------------------------

値はconst wchar_t*でやりとりするみたいなので、そのままUnicodeStringが使えそう。でも、何か嫌な予感が。