-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathncbind.cpp
More file actions
133 lines (107 loc) · 4.18 KB
/
ncbind.cpp
File metadata and controls
133 lines (107 loc) · 4.18 KB
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "ncbind.hpp"
#ifdef TVP_STATIC_PLUGIN
#define EXPORT(hr) static hr STDCALL
#else
#if defined(_MSC_VER)
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __attribute__((visibility("default")))
#endif
#define EXPORT(hr) extern "C" DLL_EXPORT hr STDCALL
#ifdef _WIN32
#ifdef _MSC_VER
# if defined(_M_AMD64) || defined(_M_X64)
# pragma comment(linker, "/EXPORT:V2Link")
# pragma comment(linker, "/EXPORT:V2Unlink")
# else
# pragma comment(linker, "/EXPORT:V2Link=_V2Link@4")
# pragma comment(linker, "/EXPORT:V2Unlink=_V2Unlink@0")
# endif
#endif
#ifdef __GNUC__
asm (".section .drectve");
# if defined(__x86_64__) || defined(__x86_64)
asm (".ascii \" -export:V2Link=V2Link -export:V2Unlink=V2Unlink\"");
# else
asm (".ascii \" -export:V2Link=V2Link@4 -export:V2Unlink=V2Unlink@0\"");
# endif
#endif
//--------------------------------------
HINSTANCE gDllInstance = NULL;
//--------------------------------------
extern "C"
BOOL WINAPI
DllMain(HINSTANCE hinst, DWORD reason, LPVOID /*lpReserved*/)
{
if (reason == DLL_PROCESS_ATTACH)
gDllInstance = hinst;
return 1;
}
#endif
#endif // TVP_STATIC_PLUGIN
//---------------------------------------------------------------------------
static tjs_int GlobalRefCountAtInit = 0;
EXPORT(HRESULT) V2Link(iTVPFunctionExporter *exporter)
{
// スタブの初期化(必ず記述する)
TVPInitImportStub(exporter);
NCB_LOG_W("V2Link");
// AutoRegisterで登録されたクラス等を登録する
ncbAutoRegister::AllRegist();
// この時点での TVPPluginGlobalRefCount の値を
GlobalRefCountAtInit = TVPPluginGlobalRefCount;
// として控えておく。TVPPluginGlobalRefCount はこのプラグイン内で
// 管理されている tTJSDispatch 派生オブジェクトの参照カウンタの総計で、
// 解放時にはこれと同じか、これよりも少なくなってないとならない。
// そうなってなければ、どこか別のところで関数などが参照されていて、
// プラグインは解放できないと言うことになる。
return S_OK;
}
//---------------------------------------------------------------------------
EXPORT(HRESULT) V2Unlink()
{
// 吉里吉里側から、プラグインを解放しようとするときに呼ばれる関数
// もし何らかの条件でプラグインを解放できない場合は
// この時点で E_FAIL を返すようにする。
// ここでは、TVPPluginGlobalRefCount が GlobalRefCountAtInit よりも
// 大きくなっていれば失敗ということにする。
if (TVPPluginGlobalRefCount > GlobalRefCountAtInit) {
NCB_LOG_W("V2Unlink ...failed");
return E_FAIL;
// E_FAIL が帰ると、Plugins.unlink メソッドは偽を返す
} else {
NCB_LOG_W("V2Unlink");
}
/*
ただし、クラスの場合、厳密に「オブジェクトが使用中である」ということを
知るすべがありません。基本的には、Plugins.unlink によるプラグインの解放は
危険であると考えてください (いったん Plugins.link でリンクしたら、最後ま
でプラグインを解放せず、プログラム終了と同時に自動的に解放させるのが吉)。
*/
// AutoRegisterで登録されたクラス等を削除する
ncbAutoRegister::AllUnregist();
// スタブの使用終了(必ず記述する)
TVPUninitImportStub();
return S_OK;
}
#ifdef TVP_STATIC_PLUGIN
#if defined(_MSC_VER)
#define EXPORT_USED __declspec(dllexport)
#else
#define EXPORT_USED __attribute__((visibility("default"), used))
#endif
#define str(x) TJS_W(#x)
#define strx(x) str(x)
#define CAT(a, b) a##b
#define XCAT(a, b) CAT(a, b)
#define MAKE_FUNC(name) XCAT(krkrz_plugin_, name)
// リンク用エントリ関数
// _krkrz_plugin_プロジェクト名 で関数が作られる
extern "C" EXPORT_USED void STDCALL MAKE_FUNC(TVP_PLUGIN_NAME)() {
static iTVPStaticPlugin plugin;
plugin.name = strx(TVP_PLUGIN_NAME);
plugin.link = (int32_t (STDCALL *)(iTVPFunctionExporter *))V2Link;
plugin.unlink = (int32_t (STDCALL *)(void))V2Unlink;
TVPRegisterPlugin(&plugin);
}
#endif