HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0104
こいるhsedsdkのメモリリーク・ハンドルリークの原因と解決策2解決


こいる

リンク

2022/1/4(Tue) 23:02:35|NO.94881

以前報告した、hsedsdkのhsed_gettext命令を呼び出すたび、メモリリークとハンドルリークが起きる現象の原因と解決策が分かったので報告します。


■原因
原因はパイプハンドルが解放できていないことでした。

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



この記事に返信する


おにたま(管理人)

リンク

2022/1/5(Wed) 21:38:08|NO.94889

>こいる さん

hsedsdkについてのご報告ありがとうございます。
解決策の方、参考にさせて頂きます。



こいる

リンク

2022/1/5(Wed) 22:27:24|NO.94891

おにたまさんご返信ありがとうございます。
お役に立てれば幸いです。



ONION software Copyright 1997-2023(c) All rights reserved.