-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathncbind.cpp
More file actions
124 lines (99 loc) · 3.93 KB
/
ncbind.cpp
File metadata and controls
124 lines (99 loc) · 3.93 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
#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");
TVPAddLog(NCB_XTOSTR(TVP_PLUGIN_NAME));
// 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
// リンク用エントリ関数
// _krkrz_plugin_プロジェクト名 で関数が作られる
extern "C" void STDCALL NCB_XCAT(krkrz_plugin_,TVP_PLUGIN_NAME)()
{
static iTVPStaticPlugin plugin;
plugin.name = NCB_XTOSTR(TVP_PLUGIN_NAME);
plugin.link = (int32_t (STDCALL *)(iTVPFunctionExporter *))V2Link;
plugin.unlink = (int32_t (STDCALL *)(void))V2Unlink;
TVPRegisterPlugin(&plugin);
}
#endif