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)してみました。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。