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

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



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.94881への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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