
ruby1.9.3でwin32oleを使ってwordを操作するCGIプログラムを作っています。
ローカルでサーバーを立ち上げてCGIとして動かしてるのですが、win32oleオブジェクトを作ろうとWIN32OLE.newメソッドを実行する所でエラーが出ます。
同じソースを友人に試してもらったのですが、自分と違いエラーが出ず、何が原因なのか分からないまま途方にくれています。
原因に思い当たることや気になることがあるだけでも、聞いてもらえれば答えられる範囲で全て答えますので、何卒ご助言ご協力をお願いします。
###問題のコード
別のソースからsessionを受け取って動作を開始します。
dbは同じフォルダにあるpstoreで作ったファイルからデータを読み込んでいます
kisei.rb
ruby
1#! C:\ruby\Ruby193\bin\ruby.exe -Ks 2 3require "cgi" 4require "cgi/session" 5require "pstore" 6require "win32ole" 7load('./word_replace.rb') 8 9cgi = CGI.new(:accept_charset => "Windows-31J") 10session = CGI::Session.new(cgi) 11user_db = PStore.new("\pstore.db") 12 13time = Time.now 14time = time.strftime("%F") 15 16name = session["name"] 17number = session["number"] 18sex = session["sex"] 19years = "28" 20begin_month = session["begin_month"] 21begin_day = session["begin_day"] 22begin_hour = session["begin_hour"] 23begin_minutes = session["begin_minutes"] 24end_month = session["end_month"] 25end_day = session["end_day"] 26end_hour = session["end_hour"] 27end_minutes = session["end_minutes"] 28 29db_num = "#{sex}" + "-" + "#{number}" 30user_db.transaction(true) do 31 stu_number = user_db["#{db_num}_stu_number"] 32 dep = user_db["#{db_num}_dep"] 33 year = user_db["#{db_num}_year"] 34 clas = user_db["#{db_num}_class"] 35 phone_number = user_db["#{db_num}_phone_number"] 36end 37 38word_name = "#{time}" + "#{db_num}" + "#{name}" 39 40word = WIN32OLE.new("Word.Application") 41doc = word.documents.open("./kisei.docx") 42doc.saveas("#{word_name}.docx") 43doc.close 44 45word_rp("#{word_name}.docx", "name", "#{name}") 46word_rp("#{word_name}.docx", "number", "#{db_num}") 47word_rp("#{word_name}.docx", "stu_number", "#{stu_number}") 48word_rp("#{word_name}.docx", "dep", "#{dep}") 49word_rp("#{word_name}.docx", "year", "#{year}") 50word_rp("#{word_name}.docx", "class", "#{clas}") 51word_rp("#{word_name}.docx", "phone_number", "#{phone_number}") 52word_rp("#{word_name}.docx", "years", "#{years}") 53word_rp("#{word_name}.docx", "begin_month", "#{begin_month}") 54word_rp("#{word_name}.docx", "begin_day", "#{begin_day}") 55word_rp("#{word_name}.docx", "begin_hour", "#{begin_hour}") 56word_rp("#{word_name}.docx", "begin_minutes", "#{begin_minutes}") 57word_rp("#{word_name}.docx", "end_month", "#{end_month}") 58word_rp("#{word_name}.docx", "end_day", "#{end_day}") 59word_rp("#{word_name}.docx", "end_hour", "#{end_hour}") 60word_rp("#{word_name}.docx", "end_minutes", "#{end_minutes}") 61 62word.quit 63 64header = cgi.header({"charset"=>"Shift_JIS"}) 65puts header 66 67print <<EOF 68<head> 69<title>確認</title> 70</head> 71 72<body> 73<h1>確認画面<h1> 74<input type="submit" value="送信"> 75</body> 76</html> 77EOF 78
kisei.rbがloadしてるソースです
word_replace.rb
ruby
1require "win32ole" 2 3def word_rp (word_file, str, chang_str) 4 word = WIN32OLE.new("Word.Application") 5 6 doc = word.documents.open(word_file) 7 find = word.selection.find 8 9 find.clearformatting 10 find.replacement.clearformatting 11 find.text = str 12 find.forward = true 13 find.matchwholeword = true 14 15 find.replacement.text = chang_str 16 find.execute(nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,2) 17 doc.save 18 doc.close 19 word.quit 20end
ローカルでサーバーを動かすソース
ruby
1require "webrick" 2 3IP = "127.0.0.1" 4PORT = "8080" 5DOC = 'C:\Users\mi131301\Documents\ruby\PBL' 6CGI_PATH = 'C:\ruby\Ruby193\bin\ruby.exe' 7 8opts = { 9 :BindAddress => IP, 10 :Port => PORT, 11 :DocumentRoot => DOC, 12 :CGIInterpreter => CGI_PATH 13} 14 15server = WEBrick::HTTPServer.new(opts) 16 17server.mount('/login.rb', WEBrick::HTTPServlet::CGIHandler, 'login.rb') 18server.mount('/error.rb', WEBrick::HTTPServlet::CGIHandler, 'error.rb') 19server.mount('/form.rb', WEBrick::HTTPServlet::CGIHandler, 'form.rb') 20server.mount('/kisei.rb', WEBrick::HTTPServlet::CGIHandler, 'kisei.rb') 21server.mount('/kisei2.rb', WEBrick::HTTPServlet::CGIHandler, 'kisei2.rb') 22 23trap("INT"){server.shutdown} 24 25server.start
###出てくるエラー
[2016-01-31 21:37:23] ERROR CGIHandler: kisei.rb:
kisei.rb:40:in initialize': failed to create WIN32OLE object from
Word.Applica
tion' (WIN32OLERuntimeError)
HRESULT error code:0x80080005
Server execution failed
from kisei.rb:40:in new' from kisei.rb:40:in
<main>'
[2016-01-31 21:37:23] ERROR CGIHandler: kisei.rb exit with 1
[2016-01-31 21:37:23] ERROR Premature end of script headers: kisei.rb
PC131301 - - [31/Jan/2016:21:36:53 ���� (�W����)] "POST /kisei.rb HTTP/1.1" 500
321
[ブラウザでの表示]
[kisei.rbを実行すると出てくる]
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。