Как я могу безопасно использовать WIN32OLE из приложения rails? - PullRequest
3 голосов
/ 04 марта 2011

Я пытаюсь использовать гем win32ole в приложении на Rails 3 и сталкиваюсь с некоторыми проблемами, которые, я думаю, связаны с потоками.По сути, у меня есть такой код, который я использую для получения пользовательских данных из нашего хранилища Active Directory:

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

Но это дает спорадическую ошибку при запуске как часть запроса Rails (я думаю, что первыйзапрос после перезапуска приложения Rails всегда работает).Он прекрасно работает каждый раз , когда я запускаю этот код из автономного приложения Ruby.Я немного понял из Googling, что это связано с тем, что объект OLE / COM можно использовать только в том потоке, в котором он был инициализирован (что-то связанное с тем, что он работает в STA?).Исходя из этого, я предполагаю, что это как-то связано с Rails 3, выполняющим разные запросы в разных потоках?(Приложение My Rails работает на Windows.)

Ошибка, выдаваемая вызовом WIN32OLE.connect, 'connect': failed to parse display name of moniker.

Есть идеи, как это исправить?

1 Ответ

2 голосов
/ 10 марта 2011

Я наконец-то решил эту проблему благодаря информации и коду здесь .Я изменил свой win32ole.rb файл, как предложено там, на barf, если CoInitialize не был вызван первым в главном потоке.Я достиг этого в своем приложении на Rails 3, добавив Ruby-файл в каталог config/initializers, содержащий только

require 'win32ole'

Это, похоже, исправило его.

...