« [Ruby] ruby-debug19 | トップページ | [Ruby] gmail_contacts »

2009年9月 3日 (木)

[Ruby] pr-win32ole


まだ公式にはリリースされていない pure Ruby で書かれた Win32OLE ライブラリ(ruby-talk:345507,
<URL:http://pure.rubyforge.org/svn/pr-win32ole>)。



すごいなあ。私には書けそうにない。



今のWin32OLEのコードは、難しくてメンテナンスしづらいので、
pure Ruby バージョンの Win32OLE によって、もっと Win32OLE をよりわかりやすく
メンテナンスしやすくしようというのが目的だそうです。



おっしゃる通りです。反論できません。



で、一連のスレッドの話だけど、Win32OLE のバグなのかなあ。



推測すると



OLEサーバ側が Win32OLE 側の EVENTSINK_Invoke(イベントハンドラ) を呼び出す。
Win32OLE側は、EVENTSINK_Invoke の引数 pvarResult が NULL でないからイベントハンドラの
実行結果(戻り値)を pvarResult に設定して OLEサーバ側に返そうとする。
で、pvarResult に値を設定しようとしているところでハングアップしている。



っぽい。



pvarResult が指すメモリは、EVENTSINK_Invoke を呼び出すOLEサーバ側が確保してくれ(て、後始末もOLEサーバ側でやってくれ)るものと
Win32OLEは期待している。
もし、OLEサーバ側でpvarResultが指すメモリを確保してなくてしかも NULL でない pvarResult が渡されてくるとしたらクラッシュしそう。



で、Win32OLEは、OLEサーバが あらかじめ pvarResult のメモリ確保をしてくれていることを期待してもいいんだよね?


|

« [Ruby] ruby-debug19 | トップページ | [Ruby] gmail_contacts »

コメント

期待して良いのは、ポインタ用の4バイト(32ビットWindowsの場合)だけです。
この辺にまとめてあります。http://www.artonx.org/collabo/backyard/?ComMemoryLeak

投稿: arton | 2009年9月 4日 (金) 03時22分

ええっ。そうなんですか?
HRESULT Invoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr
)
の pVarResult が指すメモリって呼び出す方じゃなくて呼び出された方で確保するものなのでしょうか?

投稿: suke | 2009年9月 4日 (金) 07時08分

この記事へのコメントは終了しました。

« [Ruby] ruby-debug19 | トップページ | [Ruby] gmail_contacts »