extern "C" __declspec(dllexport) HRESULT __stdcall V2Link(iTVPFunctionExporter *exporter) { // スタブの初期化(必ず記述する) TVPInitImportStub(exporter); // 初期化 prevTime = TVPGetTickCount(); TVPAddContinuousEventHook(&limit); { // TJS のグローバルオブジェクトを取得する iTJSDispatch2 * global = TVPGetScriptDispatch(); // Layer クラスオブジェクトを取得 tTJSVariant varScripts; TVPExecuteExpression(TJS_W("System"), &varScripts); iTJSDispatch2 *dispatch = varScripts.AsObjectNoAddRef(); if (dispatch) { tTJSDispatch *method = new tFpsLimitProp(); tTJSVariant var(method); dispatch->PropSet(TJS_MEMBERENSURE, FPSLIMITNAME, NULL, &var, dispatch); method->Release(); } global->Release(); } GlobalRefCountAtInit = TVPPluginGlobalRefCount; return S_OK; }
extern "C" __declspec(dllexport) HRESULT _stdcall V2Link(iTVPFunctionExporter *exporter) { TVPInitImportStub(exporter); TVPSetXP3ArchiveExtractionFilter(TVPXP3ArchiveExtractionFilter); return S_OK; }
extern "C" HRESULT _stdcall V2Link(iTVPFunctionExporter *exporter) { // スタブの初期化(必ず記述する) TVPInitImportStub(exporter); TVPRegisterDSVideoCodec( TJS_W(".ogg"), (void*)&MEDIASUBTYPE_Ogg, tTVPCreateOggFilter, tTVPCreateTheoraFilter, tTVPCreateVorbisFilter, NULL ); TVPRegisterDSVideoCodec( TJS_W(".ogv"), (void*)&MEDIASUBTYPE_Ogg, tTVPCreateOggFilter, tTVPCreateTheoraFilter, tTVPCreateVorbisFilter, NULL ); GlobalRefCountAtInit = TVPPluginGlobalRefCount; return S_OK; }
//--------------------------------------------------------------------------- // V2Link : Initialize TVP plugin interface //--------------------------------------------------------------------------- HRESULT __stdcall V2Link(iTVPFunctionExporter *exporter) { // メモリ確保位置でブレークを貼るには以下のメソッドで確保番号を指定する。 // ブレークがかかった後は、呼び出し履歴(コールスタック)を見て、どこで確保されたメモリがリークしているか探る。 // _CrtDumpMemoryLeaks でデバッグ出力にリークしたメモリの確保番号が出るので、それを入れればOK // 確保順が不確定な場合は辛いが、スクリプトを固定すればほぼ同じ順で確保されるはず。 // _CrtSetBreakAlloc(53); // 指定された回数目のメモリ確保時にブレークを貼る TVPInitImportStub(exporter); return S_OK; }
extern "C" HRESULT _stdcall _export V2Link(iTVPFunctionExporter *exporter) { // スタブの初期化(必ず記述する) TVPInitImportStub(exporter); // TestFunction の作成と登録 tTJSVariant val; // TJS のグローバルオブジェクトを取得する iTJSDispatch2 * global = TVPGetScriptDispatch(); // 1 まずオブジェクトを作成 DrawFFTGraphFunction = new tDrawFFTGraphFunction(); // 2 DrawFFTGraphFunction を tTJSVariant 型に変換 val = tTJSVariant(DrawFFTGraphFunction); // 3 すでに val が DrawFFTGraphFunction を保持しているので、 // DrawFFTGraphFunction は Release する DrawFFTGraphFunction->Release(); // 4 global の PropSet メソッドを用い、オブジェクトを登録する global->PropSet( TJS_MEMBERENSURE, // メンバがなかった場合には作成するようにするフラグ TJS_W("drawFFTGraph"), // メンバ名 ( かならず TJS_W( ) で囲む ) NULL, // ヒント ( 本来はメンバ名のハッシュ値だが、NULL でもよい ) &val, // 登録する値 global // コンテキスト ( global でよい ) ); // - global を Release する global->Release(); // val をクリアする。 // これは必ず行う。そうしないと val が保持しているオブジェクト // が Release されず、次に使う TVPPluginGlobalRefCount が正確にならない。 val.Clear(); // この時点での TVPPluginGlobalRefCount の値を GlobalRefCountAtInit = TVPPluginGlobalRefCount; TVPAddLog(TVPPluginGlobalRefCount); // として控えておく。TVPPluginGlobalRefCount はこのプラグイン内で // 管理されている tTJSDispatch 派生オブジェクトの参照カウンタの総計で、 // 解放時にはこれと同じか、これよりも少なくなってないとならない。 // そうなってなければ、どこか別のところで関数などが参照されていて、 // プラグインは解放できないと言うことになる。 return S_OK; }
//--------------------------------------------------------------------------- // V2Link : Initialize TVP plugin interface //--------------------------------------------------------------------------- extern "C" HRESULT _stdcall _export V2Link(iTVPFunctionExporter *exporter) { TVPInitImportStub(exporter); return S_OK; }