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 が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/933
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。