読み込まれた側の.js自身から、その「.js」ファイルの場所を起点に別のファイル(.dllや.JSONや.txt)などを開く場合、 読み込まれた側の.jsファイルは、プログラム実行時に「自分自身のファイルが配置されている場所」を知る必要性があります。
execjs macrodir + @"\jsmode_modules\require.js"; js { var myabc = require("abc"); }
hidemaruGlobal.message(__filename); hidemaruGlobal.message(__dirname); var jsonobj = require(__dirname + "\\bbb.json"); // 自分自身(=abc.js)と同じディレクトリのbbb.json の読み込み var dll = loadDll(__dirname + "\\bbb.dll");; // 自分自身(=abc.js)と同じディレクトリのbbb.dll の読み込み
// execjsで読み込まれていたら、{__filename,__dirname}のそれぞれのプロパティに有効な値が入る function get_including_by_execjs() { var cjf = hidemaruGlobal.currentjsfilename(); var cmf = hidemaruGlobal.currentmacrofilename(); if (cjf != cmf) { var dir = cjf.replace(/[\/\\][^\/\\]+?$/, ""); return { "__filename": cjf, "__dirname": dir }; } return {}; } // execjs による読み込み&実行中かどうか function is_executing_by_execjs() { var cjf = hidemaruGlobal.currentjsfilename(); var cmf = hidemaruGlobal.currentmacrofilename(); if (cjf != cmf) { return true; } else { return false; } } debuginfo(2); var selfpathobj = get_including_by_execjs(); console.log(selfpathobj.__filename); console.log(selfpathobj.__dirname); // execjsによる読み込みと実行が終わった後で、このabc()関数が呼ばれたとしても // この関数内のget_including_by_execjs()はパスを返さないので注意。 function abc() { var path = get_including_by_execjs(); // is_executing_by_execjs() が falseならば、get_including_by_execjs()は{}を返す debuginfo(2); console.log(is_executing_by_execjs()); } abc(); // これはtrueと表示される。しかし、execjsが終わった後、abc()を実行してもfalseと表示される。
jsmode "JScript", 1; execjs currentmacrodirectory + "\\bbb.js"; js{ abc(); // これはfalseが表示される }