■原因
原因はパイプハンドルが解放できていないことでした。
hsedsdk.asのhsed_uninitduppipe命令内で、DuplicateHandle関数で複製したハンドル(hDupReadPipe, hDupWritePipe)をCloseHandle関数で閉じようとしていますが、実際は閉じれていないようです。
CloseHandleで閉じるには、複製したハンドルの対象プロセス内で呼び出す必要があるみたいです。
ちなみに、hsed_gettext命令だけでなく、パイプを使う命令すべて(hsed_getver, hsed_getpath, hsed_settext, hsed_sendstr)でリークが起きていたようです。
■解決策
別プロセスでCloseHandleを呼び出すのは手間なので、DuplicateHandle関数で閉じます。
※引数1に複製ハンドルの対象プロセス(つまりHSPエディタ)のハンドル、引数2に閉じる複製ハンドル、引数3〜6に0(NULL)、引数7に0x1(DUPLICATE_CLOSE_SOURCE) を渡して呼び出す
hsedsdk.asを、下記手順にそって編集してください。
1. 22行目のDuplicateHandle関数登録の引数4を、varからsptrに変更(NULLを渡せるようにするため)
2. 145,146行目のDuplicateHandle関数呼び出しの引数4の変数を、varptr()で囲う(手順1の変更に対応するため)
3. 128,129行目の、複製ハンドルをCloseHandleするコードを消す
4. 手順3で消したところに下記コードを書く
GetWindowThreadProcessID@hsedsdk hIF, dwProcessID OpenProcess@hsedsdk PROCESS_ALL_ACCESS@hsedsdk, 0, dwProcessID hHsedProc = stat if hDupReadPipe: DuplicateHandle hHsedProc, hDupReadPipe, 0, 0, 0, 0, 0x1: hDupReadPipe = 0 if hDupWritePipe: DuplicateHandle hHsedProc, hDupWritePipe, 0, 0, 0, 0, 0x1: hDupWritePipe = 0 CloseHandle@hsedsdk hHsedProc