BDS2006(C++Builder)からRubyを使う(2)

前回の続き

メソッドの実行結果を受け取り、結果を表示します。

フォームにメモとボタンをを貼り付けます。

Unit1.h の private に次のメソッドを追加します。

__declspec(dllexport) char* (*rb_string_value_cstr)(volatile unsigned long*);

Unit1.cpp の TForm1::TForm1(TComponent* Owner) に次の行を追加します。

rb_string_value_cstr = (char* (*)(volatile unsigned long*))GetProcAddress(hDll,"rb_string_value_cstr");

ボタンのイベントを追加します。

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  if (!hDll)
  {
    Application->MessageBox("msvcrt-ruby18.dll が見つかりませんでした。",
                            "DLL エラー",
                            MB_ICONSTOP | MB_OK);
    return;
  }
  //Rubyインタプリタの初期化
  ruby_init();

  //スクリプトの実行
  unsigned long value = rb_eval_string("'実行結果'");
  //実行結果の文字列を取得する
  AnsiString result = rb_string_value_cstr(&value);
  Memo1->Lines->Add(result);

  //スクリプトの実行
  value = rb_eval_string("File.open('test.rb', 'r' ).read");

  //実行結果の文字列を取得する
  TStringList* list = new TStringList();
  list->Text = rb_string_value_cstr(&value);
  Memo1->Lines->Add(list->Text);
  delete list;

  //Rubyインタプリタのクリーンアップ
  ruby_cleanup(0);

}

ボタンをクリックして、メモに「実行結果」と「test.rb」の内容が表示されたら成功です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください