October 03, 2015

require 'win32ole' で終了コードが0xc0000005 (対処療法)

前回の記事でE-MailRelayを使ったメールアドレスの送信直前チェック方法を書きましたが、一部の環境でエラーがでることがわかりました。チェックするRubyスクリプトの終了コードがアドレスチェックにあたって重要なのですが、終了コードが常に-1073741819 (0xc0000005)になってしまうのです。調べたところこの値はAccess Violationで、権限に関する問題だと思われます。

require 'win32ole'をするだけの短いスクリプトを実行後、$? (cygwin) あるいは %ERRORLEVEL% (Windows cmd.exe)を見てみると、その値になっていたことから、OLE絡みであることは確かでした。WIN32OLE#ole_freeを実行してみましたが、改善しませんでした。

そこで対処療法をしました。win32oleを使う部分を別プロセスに閉じ込めることにしました。スクリプトは現在下記のようになっています(前のリビジョンへのリンク)。

forkで別プロセスを起動し、プロセス間通信はPipeを利用して、オブジェクトはMarshalでやり取りをしています。根本的解決にはなりませんが、取り急ぎ終了コードが正しいものになり、アドレスをチェックする目的が達成できるようになりました。

※その後、バッチファイルに埋め込み(shebang)してみました。

07:49 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/933