kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

VC2010のカスタムウィザードを作る その3

展開するファイルの設定ができたら、default.jsファイルを編集する。
今回はフィルターとプロジェクトへのファイルの追加。


JScriptでカスタムする場合はリファレンスが必須になる。
リファレンスはここを参照
特にここを見ておけば、大体必要なものはそろう。


実はこのリファレンスにたどり着くのが一番苦労したとこだったり・・・

フィルターの設定

まずはフィルターの設定。
今回は以下の構成で作成する。

sources
  main
  tests


フィルターはAddFilters関数で設定するようになっているので、
関数を以下のように書き換える。

function AddFilters(proj)
{
    try
    {
        // プロジェクトにフォルダーを追加する 
        var sources = proj.Object.AddFilter('sources');
        sources.AddFilter('main');
        sources.AddFilter('tests');
    }
    catch(e)
    {
        throw e;
    }
}

AddFilterの戻り値はFilter(VCFilter)なので、さらにAddFilterすることでフィルターの階層を作成できる。
フィルターはこれでOK。

プロジェクトへのファイルの追加

Templates.infで設定したファイルはプロジェクト以下にコピーされるが、
同時に全てのファイルがプロジェクトに追加されるようになっている。
これを行っているのが「AddFilesToCustomProj」関数。


この関数では2つの設定が必要となる。

  • dll等特殊なファイルの追加設定
  • 各ファイルのフィルター指定
dll等特殊なファイルの追加設定

dllやlibはそのままだと追加時にエラーが出るので、設定が必要。
すでに「.bmp」等の取り扱いが書いてあるので、それをまねて書く。


拡張子が「,dll」や「.lib」の場合はコピーのみにする必要がある。

var bCopyOnly = false;
var strExt = strName.substr(strName.lastIndexOf("."));
if (|| strExt == ".dll"
    || strExt == ".lib") {
	bCopyOnly = true;
}
wizard.RenderTemplate(strTemplate, strFile, bCopyOnly);


また、dllやlibはコピーするが、プロジェクトに追加しないことにする。
dllはそもそも不要だし、libは後で「追加の依存ファイル」で設定する。


少し下の「proj.Object.AddFile(strFile)」がそのコードになるので、dllとlibは呼び出さないように手を加える。

if (strExt == ".dll"
    || strExt == ".lib") {
    // dllとlibは無視
}
else {
    proj.Object.AddFile(strFile);
}
各ファイルのフィルター指定

main.cpp等は特定のフィルター下に表示したいので、手を加える。
フィルターのオブジェクトを捕まえて、フィルターにAddFileすることで実現する。

if (strFile.search('main.cpp') != -1) {
    var fil = proj.Object.Filters.Item('main');
    fil.addFile(strFile);
}


最終的な関数は以下のとおり。
CppUnitのヘッダ郡も後で「追加のインクルードファイル」で指定する事とし、
AddFileを避けるように実装した。

function AddFilesToCustomProj(proj, strProjectName, strProjectPath, InfFile)
{
    try
    {
        var projItems = proj.ProjectItems

        var strTemplatePath = wizard.FindSymbol('TEMPLATES_PATH');

        var strTpl = '';
        var strName = '';

        var strTextStream = InfFile.OpenAsTextStream(1, -2);
        while (!strTextStream.AtEndOfStream)
        {
            strTpl = strTextStream.ReadLine();
            if (strTpl != '')
            {
                strName = strTpl;
                var strTarget = GetTargetName(strName, strProjectName);
                var strTemplate = strTemplatePath + '\\' + strTpl;
                var strFile = strProjectPath + '\\' + strTarget;

                var bCopyOnly = false;
                var strExt = strName.substr(strName.lastIndexOf("."));
                if (strExt == ".bmp"
                    || strExt == ".ico"
                    || strExt == ".gif"
                    || strExt == ".rtf"
                    || strExt == ".css"
                    || strExt == ".dll"
                    || strExt == ".lib")
                    bCopyOnly = true;
                wizard.RenderTemplate(strTemplate, strFile, bCopyOnly);

                if (strFile.search("main.cpp") != -1) {
                    var filter = proj.Object.Filters.Item("main");
                    filter.AddFile(strFile);
                }
                else if (strFile.search("SampleClassTest") != -1) {
                    var filter = proj.Object.Filters.Item("tests");
                    filter.AddFile(strFile);
                }
                else if (strExt == ".dll"
                    || strExt == ".lib"
                    || strExt == ".h") {
                    // 無視する
                }
                else {
                    proj.Object.AddFile(strFile);
                }
            }
        }
        strTextStream.Close();
    }
    catch(e)
    {
        throw e;
    }
}