【问题标题】:Render Word Document from Remote Server using WIN32OLE in ruby on rails在 ruby​​ on rails 中使用 WIN32OLE 从远程服务器渲染 Word 文档
【发布时间】:2012-05-11 21:34:14
【问题描述】:

当我当时使用 win32ole 作为独立应用程序时,一切似乎都运行良好,一旦我放入运行在 mongrel 服务器上的 rails 应用程序,它就会进入无限循环。

我正在尝试访问“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

当我当时单独运行此代码时,会弹出一个弹出窗口以获取 Microsoft 共享点凭据。但是在 mongrel rails 中它会进入无限循环。

我是否需要处理此弹出窗口才能通过 Rails 显示?

【问题讨论】:

  • 进度 - 当我进入 Windows 环境中的“服务”时 - 在 Mongrel 服务属性中,“登录 -> 允许与桌面交互”中有一个选项当我检查它并尝试运行我的我得到的代码“交互式服务检测 - 此计算机上运行的程序正在尝试显示消息 [内容] 该程序可能需要您或您的许可才能完成任务。为什么会发生这种情况?[V] 显示程序详细信息 [查看消息] [稍后问我]" 那么如何在浏览器而不是在后台获取此服务提示?我的方向正确吗?

标签: ruby-on-rails windows-services mongrel win32ole mongrel-cluster


【解决方案1】:

您是否考虑过修补 win32ole.rb 文件?

基本上,这是补丁的原因:

t 原来 win32ole.rb 修补了线程以调用 windows OleInitialize() 和 OleUninitialize() 函数围绕屈服于 堵塞。但是,CoInitialize 的 MS 文档(其中 OleInitialize 内部调用)声明:“第一个线程在 使用 0 调用 CoInitialize(或使用 CoInitializeEx COINIT_APARTMENTTHREADED) 必须是最后一个调用的线程 联合初始化。否则,后续在 STA 上调用 CoInitialize 将失败,应用程序将无法运行。” 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

【讨论】:

  • 是的,我以前见过这个,但是当我进入服务时我刚刚理解它时并没有理解上下文。所以你的意思是我必须使用这段代码来管理线程。并且必须只在 win32ole.rb 上进行此修复并使用它?
  • 我正在使用 redmine。我创建了 win32ole.rb 并将此代码放入其中。我已将此文件放在初始化程序文件夹中。我已经重新启动了 Mongrel 服务,但是当我尝试访问服务器 localhost:3000 时它没有响应。我需要从服务中删除这些登录设置吗?
  • 我已经在我的杂种日志“/config/initializers/win32ole.rb:12: undefined method `ole_initialize' for WIN32OLE:Class (NoMethodError)”中调试了它,当我进一步深入研究它时,我有发现我正在使用的 ruby​​ 版本 [1.8.7] 在源代码本身中没有 win32ole.rb 文件。即rxr.whitequark.org/mri/source/ext/win32ole/lib/…
  • 哇,您使用的是 1.8.7?我以为版本更高。可以升级到 1.9.1 / 1.9.2 / 1.9.2 吗?如果它不存在,它就不会“包含”。
  • 是的,我已将其升级到 1.9.3。但是没有进展同样的错误。出现以下错误:-“未处理的监听循环异常 #。user/path/redmine/config/initializers/win32ole.rb:19 ** INT signal received。” >> ....除此之外,当我启动 mongrel 服务时,它向我显示““交互式服务检测”是否与我安装的 Mongrel 服务相关,Windows 7 Ultmiate 不支持?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多