HSP 3.2b1 で 変数型を拡張するプラグインでうまく動作しない件についてのメモ

この問題は Shark++ さんが修正してくれました。 Shark++++

原因は DLL を開放した後で DLL 内の関数を呼んでしまう箇所があったから。それは、 DLL で拡張された変数の開放関数。(HspVarProc::Free)

DLL のハンドルを開放するのは win32gui/hsp3extlib.cpp の Hsp3ExtLibTerm 。それを呼んでいるのは win32gui/hsp3ext_win.cpp の termfunc_dllcmd 。これは TYPE_DLLFUNC の termfunc 。
で、 TYPE_DLLFUNC も含めて 各種 HSP3TYPEINFO の termfunc を呼び出しているのは hsp3code.cpp の code_termfunc 。ここでは一番後ろのインデックスの typeinfo から順番に temfunc を呼んでいるので、プラグインの typeinfo の termfunc を開放するよりも先に DLL のハンドルを開放される心配はない。

で、変数の開放をしているのが hspvar_core.cpp HspVarCoreBye(テンポラリ変数の開放) と hsp3.cpp の Hsp3::Dispose 。 DLL 開放が code_termfunc で 変数開放が HspVarCoreBye と Hsp3::Dispose。この二つは Hsp3::~Hsp3 で呼んでる。呼ぶ順番は code_termfunc -> Dispose -> code_bye 。そう、変数開放より先に DLL が開放されているというわけだ。
すると DLL で拡張された変数の開放関数は既に DLL が開放されているので呼び出すとメモリ違反になる。それが今回の原因。 DLL で拡張された型の変数を DLL 開放より先に呼び出すように修正したのが今回の Shark++ さんのコミットというわけでした。