【问题标题】:How can I use WIN32OLE safely from a rails app?如何从 rails 应用程序安全地使用 WIN32OLE?
【发布时间】:2011-03-04 07:48:00
【问题描述】:

我正在尝试在 Rails 3 应用程序中使用 win32ole gem,但遇到了一些我认为与线程相关的问题。基本上,我有这样的代码,用于从我们的 Active Directory 存储中获取用户特定的数据:

root = WIN32OLE.connect("LDAP://RootDSE")

但这在作为 Rails 请求的一部分运行时会出现零星错误(我认为 Rails 应用程序重新启动后的第一个请求总是有效的)。当我从独立的 Ruby 应用程序运行此代码时,它每次都能正常工作。我从一些谷歌搜索中了解到,这是因为 OLE/COM 对象只能在它最初初始化的线程中使用(与它在 STA 中运行有关吗?)。从那我猜这与 Rails 3 在不同的线程上运行不同的请求有关吗? (我的 Rails 应用程序在 Windows 机器上运行。)

WIN32OLE.connect 调用引发的错误是'connect': failed to parse display name of moniker

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: ruby-on-rails win32ole


    【解决方案1】:

    感谢信息和代码here,我终于解决了这个问题。如果CoInitialize 没有在主线程上首先被调用,我按照那里的建议修改了我的win32ole.rb 文件。我在我的 Rails 3 应用程序中实现了 ,方法是将 Ruby 文件添加到仅包含

    config/initializers 目录
    require 'win32ole'
    

    这似乎已经解决了。

    【讨论】:

    • 本。这是未来的谈话。你在这里提到的链接现在已经死了。我需要你过去的知识!
    • 抱歉,我找不到那个确切的链接了。即便如此,您也不需要引用它:只要确保在调用任何创建WIN32OLE 对象之前调用CoInitialize。我在 Rails 中遇到这个问题的唯一原因是线程竞争条件。 Rails 初始化器可以用来解决这个问题。
    • 我得到了“无法加载此类文件--win32ole”和require 'win32ole'...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多