2011-03-04 44 views
2

我試圖在Rails 3應用程序中使用win32ole gem,並遇到一些我認爲與線程相關的問題。基本上,我有這樣的代碼,我用它來從我們的活動目錄商店獲得用戶特定的數據:如何從rails應用程序安全地使用WIN32OLE?

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

任何想法如何解決這個問題?

回答

2

由於信息&代碼here,我終於解決了這個問題。如果CoInitialize沒有在主線程中第一次調用,我修改了我的win32ole.rb文件,建議在那裏給barf。我在我的Rails通過添加一個Ruby文件含有config/initializers目錄實現 3應用只是

require 'win32ole' 

這似乎已經解決了。

+2

本。這是未來的談話。你在這裏提到的鏈接現在已經死了。我需要你從過去的知識! – Aarmora 2014-06-06 01:46:36

+0

對不起,我再次找不到確切的鏈接。即使如此,你也不需要參考它:只要確保在任何調用創建一個'WIN32OLE'對象之前調用'CoInitialize'。我在Rails中遇到這個問題的唯一原因是因爲線程競爭條件。 Rails初始化器可以用來解決這個問題。 – Ben 2015-08-28 16:18:24

相關問題