-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathMain.cpp
107 lines (85 loc) · 3.96 KB
/
Main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifdef _WIN32
#include <windows.h>
#endif
#include "tp_stub.h"
#ifdef _WIN32
#define DLL_EXPORT __declspec(dllexport)
#define STDCALL __stdcall
#else
typedef tjs_error HRESULT;
#define DLL_EXPORT
#endif
#include "KAGParser.h"
//---------------------------------------------------------------------------
#ifdef _WIN32
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) {
return 1;
}
#endif
//---------------------------------------------------------------------------
static tjs_int GlobalRefCountAtInit = 0;
extern "C" DLL_EXPORT HRESULT STDCALL V2Link(iTVPFunctionExporter *exporter)
{
// スタブの初期化(必ず記述する)
TVPInitImportStub(exporter);
tTJSVariant val;
// TJS のグローバルオブジェクトを取得する
iTJSDispatch2 * global = TVPGetScriptDispatch();
{
//-----------------------------------------------------------------------
iTJSDispatch2 * tjsclass = TVPCreateNativeClass_KAGParser();
val = tTJSVariant(tjsclass);
tjsclass->Release();
global->PropSet( TJS_MEMBERENSURE, TJS_W("KAGParser"), nullptr, &val, global );
//-----------------------------------------------------------------------
}
// - global を Release する
global->Release();
// val をクリアする。
// これは必ず行う。そうしないと val が保持しているオブジェクト
// が Release されず、次に使う TVPPluginGlobalRefCount が正確にならない。
val.Clear();
// この時点での TVPPluginGlobalRefCount の値を
GlobalRefCountAtInit = TVPPluginGlobalRefCount;
// として控えておく。TVPPluginGlobalRefCount はこのプラグイン内で
// 管理されている tTJSDispatch 派生オブジェクトの参照カウンタの総計で、
// 解放時にはこれと同じか、これよりも少なくなってないとならない。
// そうなってなければ、どこか別のところで関数などが参照されていて、
// プラグインは解放できないと言うことになる。
return TJS_S_OK;
}
//---------------------------------------------------------------------------
extern "C" DLL_EXPORT HRESULT STDCALL V2Unlink()
{
// 吉里吉里側から、プラグインを解放しようとするときに呼ばれる関数。
// もし何らかの条件でプラグインを解放できない場合は
// この時点で E_FAIL を返すようにする。
// ここでは、TVPPluginGlobalRefCount が GlobalRefCountAtInit よりも
// 大きくなっていれば失敗ということにする。
if(TVPPluginGlobalRefCount > GlobalRefCountAtInit) return TJS_E_FAIL;
// E_FAIL が帰ると、Plugins.unlink メソッドは偽を返す
/*
ただし、クラスの場合、厳密に「オブジェクトが使用中である」ということを
知るすべがありません。基本的には、Plugins.unlink によるプラグインの解放は
危険であると考えてください (いったん Plugins.link でリンクしたら、最後ま
でプラグインを解放せず、プログラム終了と同時に自動的に解放させるのが吉)。
*/
// プロパティ開放
// - まず、TJS のグローバルオブジェクトを取得する
iTJSDispatch2 * global = TVPGetScriptDispatch();
// メニューは解放されないはずなので、明示的には解放しない
// - global の DeleteMember メソッドを用い、オブジェクトを削除する
if(global)
{
// TJS 自体が既に解放されていたときなどは
// global は NULL になり得るので global が NULL でない
// ことをチェックする
global->DeleteMember( 0, TJS_W("KAGParser"), nullptr, global );
}
// - global を Release する
if(global) global->Release();
// スタブの使用終了(必ず記述する)
TVPUninitImportStub();
return TJS_S_OK;
}
//---------------------------------------------------------------------------