1

その時点でwin32oleをスタンドアロンアプリケーションとして使用している場合、すべてが正常に機能しているように見えますが、雑種サーバーで実行されているレールアプリケーションに入れるとすぐに、無限ループに入ります。

「https://microsoft/sharepoint/document.doc」にアクセスしようとしています

def generatertm(issue) 
begin 
  word = WIN32OLE.new('word.application') 
  logger.debug("Word Initialized...") 
  word.visible = true 
  myDocLink = "https://microsoft/sharepoint/url.doc" 
  myFile = word.documents.open(myDocLink) 
  logger.debug("File Opened...") 
  puts "Started Reading bookmarks..." 
  myBookMarks = myFile.Bookmarks puts "bookmarks fetched working background task..."

  print ("Bookmakr Count : " + myBookMarks.Count.to_s + "\n")

  myBookMarks.each do |i|
    logger.warn ("Bookmark Name : " + i.Name + "\n")
  end
rescue WIN32OLERuntimeError => e
  puts e.message
  puts e.backtrace.inspect
  else
ensure

word.activedocument.close( true )  # presents save dialog box
#word.activedocument.close(false) # no save dialog, just close it
word.quit
end
end

その時点でこのコードをスタンドアロンで実行すると、1 つのポップアップが Microsoft 共有ポイントの資格情報に表示されます。ただし、雑種レールでは無限ループに入ります。

Rails を介して表示するには、このポップアップを処理する必要がありますか?

4

1 に答える 1

0

win32ole.rbファイルにパッチを適用することを検討しましたか?

基本的に、パッチの理由は次のとおりです。

win32ole.rbがスレッドにパッチを適用して、ブロックへのyieldの周りでウィンドウのOleInitialize()およびOleUninitialize()関数を呼び出すことがわかりました。ただし、CoInitialize(OleInitializeが内部で呼び出す)のMSドキュメントには、次のように記載されています。 STAは失敗し、アプリケーションは機能しません。」 http://msdn.microsoft.com/en-us/library/ms678543(v=VS.85).aspx

そして、スレッドの問題を修正するために変更されたwin32ole.rbファイルは次のとおりです。

require 'win32ole.so'

# Fail if not required by main thread.
# Call OleInitialize and OleUninitialize for main thread to satisfy the following:
#
# The first thread in the application that calls CoInitialize with 0 (or CoInitializeEx with COINIT_APARTMENTTHREADED)
# must be the last thread to call CoUninitialize. Otherwise, subsequent calls to CoInitialize on the STA will fail and the
# application will not work.
#
# See http://msdn.microsoft.com/en-us/library/ms678543(v=VS.85).aspx
if Thread.main != Thread.current
  raise "Require win32ole.rb from the main application thread to satisfy CoInitialize requirements."
else
  WIN32OLE.ole_initialize
  at_exit { WIN32OLE.ole_uninitialize }
end


# re-define Thread#initialize
# bug #2618(ruby-core:27634)

class Thread
  alias :org_initialize :initialize
  def initialize(*arg, &block)
    if block
      org_initialize(*arg) {
        WIN32OLE.ole_initialize
        begin
          block.call(*arg)
        ensure
          WIN32OLE.ole_uninitialize
        end
      }
    else
      org_initialize(*arg)
    end
  end
end

http://cowlibob.co.uk/ruby-threads-win32ole-coinitialize-and-counin

于 2012-05-02T12:17:41.310 に答える