▽Squirrelを組み込む▽
VisualC++2008EEでSquirrelが使えるようにする方法」で作成した
DLLファイルを使って、プログラムにSquirrelを組み込んでみます。

今回のプログラムではスクリプトからC++側の関数を実行しています。
(C++側でbmpのロードなど管理を行うイメージです)

1.ソリューション(プロジェクト)を作成する
Win32コンソールアプリケーションを作成します。
 1.VisualC++2008EEを起動。
 2.メニューの「ファイル」-「新規作成」-「プロジェクト」を選択。
 3.「Win32 コンソール アプリケーション」を選択して新規作成を行う。
  ※アプリケーションウィザードはWindowsアプリケーションで
   「空のプロジェクト」にチェックを入れる

2.dllファイルをコピーする
前回、作成したdllファイルをコピーします。
 1.1で作成したソリューションのフォルダにlibフォルダを作成。
 2.「前回のフォルダ/lib」から以下のdllファイルをコピーする。
  ・sqplus.lib
  ・sqstdlib.lib
  ・squirrel.lib

3.libフォルダをプロジェクトに追加する
ビルド時にdllファイルが読み込まれるようにします。
 1.メニューの「プロジェクト」-「〇〇(プロジェクト名)のプロパティ」を選択。
 2.「リンカ」をクリックし、「追加のライブラリディレクトリ」に「lib」を入力。
 3.OKボタンをクリックし、閉じる。

4.ヘッダーファイルをコピーする
前回、作成したプロジェクトからヘッダーファイルをコピーします。
 1.1で作成したソリューションのフォルダにincludeフォルダを作成。
 2.「前回のフォルダ/include」からすべてのヘッダーファイルをコピーする。
 3.「前回のフォルダ/sqplus」からすべてのヘッダーファイルをコピーする。

5.includeフォルダをプロジェクトに追加する
ビルド時にヘッダーファイルが読み込まれるようにします。
 1.メニューの「プロジェクト」-「〇〇(プロジェクト名)のプロパティ」を選択。
 2.「C/C++」をクリックし、「追加のインクルードディレクトリ」に「include」を入力。
 3.OKボタンをクリックし、閉じる。

6.文字セットを変更する
文字セットをS-Jisに変更します。
 1.メニューの「プロジェクト」-「〇〇(プロジェクト名)のプロパティ」を選択。
 2.「全般」をクリックし、「文字セット」に「マルチバイト文字セットを使用する」を選択。
 3.OKボタンをクリックし、閉じる。

7.ソースファイルを作成する
main.cppを新規作成します。
 1.ソリューションエクスプローラの「ソースファイル」を右クリック。
 2.「追加」-「新しい項目」をクリック。
 3.「C++ファイル」を選択し、ファイル名を入力、追加ボタンを押す。

8.ソースファイルを記述する
#pragma comment(lib, "squirrel.lib")
#pragma comment(lib, "sqplus.lib")
#pragma comment(lib, "sqstdlib.lib")

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>

#include <sqplus.h>

//Resource
class Resource
{
  public:
    Resource(){
      //リソース初期化
      strncpy(filename,"",257);
    }
    ~Resource(){
      //リソース解放
    }

    bool load(const char* fileName){
      strncpy(filename,fileName,257);
      return true;
    }

    const char* getFileName(){
      return filename;
    }

  private:
    char filename[257];    
};

//デバッグ用メソッド
static void printFunc(HSQUIRRELVM v, const SQChar* s, ...) 
{ 
  va_list arglist; 
  va_start(arglist, s); 

  vprintf(s, arglist);

  va_end(arglist); 
}

int main()
{
  //Squirrelバーチャルマシン初期化
  SquirrelVM::Init();

  sq_setprintfunc(SquirrelVM::GetVMPtr(),::printFunc);

  //Squirrelで使用するC++クラスを登録
  SqPlus::SQClassDef<Resource>(_T("Resource"))
    .func( &Resource::load, _T("load"))
    .func( &Resource::getFileName, _T("getFileName"));

  try{
    //Squirrelスクリプトを記述したファイルを読み込んでコンパイル
    SquirrelObject sqObj = SquirrelVM::CompileScript(_T("test.nut"));

    //Squirrelスクリプトの実行
    SquirrelVM::RunScript(sqObj);

    sqObj.Reset();
  }
  catch (SquirrelError & e)
  {
    // エラーがあった
    scprintf(_T("Error: %s\n"), e.desc);
  }

  // Squirrelバーチャルマシンシャットダウン
  SquirrelVM::Shutdown();

  return 0;
}

9.スクリプトファイルを作成する
実行ファイルが作成されるフォルダ(DebugフォルダまたはReleaseフォルダ)に
スクリプトファイルを作成します。
 1.メモ帳を開く。
 2.文字コードを「ANSI」にしてtest.nutとして保存する。
  (他のテキストエディタの場合はSJISで作成)

10.スクリプトファイル(test.nut)を記述する
local resourceA = Resource();
local resourceB = Resource();

//ファイル名を設定する。(ロードのダミー処理を行う)
resourceA.load("a.bmp");
resourceB.load("b.bmp");

//ファイル名を取得する。
print("リソースAは" + resourceA.getFileName()+"です\n");
print("リソースBは" + resourceB.getFileName()+"です\n");
11.プログラムを実行する
VisualStudioでF5を押してプログラムをビルド、実行します。
コマンドプロンプトが開き、下記のとおり表示されれば成功です。
リソースAはa.bmpです
リソースBはb.bmpです
▽参考にしたサイト様▽
ブロードバンド対応日記
「SqPlusを使ってC++のクラスをSquirrel側にバインドしてみる」
http://d.hatena.ne.jp/matobow/20060917/p1
▽改変履歴▽
2010/08/29
・ブログ「日曜ゲームクリエータの日記」から転記
2010/09/02
・C++のソースで<と>が表示されていない問題に対応