1

Когда я использую win32ole в качестве автономного приложения, в то время все работает нормально, как только я вставляю в свое приложение rails, которое работает на mongrel сервере, оно переходит в бесконечная петля.Извлечение документа Word из удаленного сервера с использованием WIN32OLE в ruby ​​on 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 Share. однако в mongrel rails он переходит в бесконечную петлю.

Нужно ли мне обращаться с этим всплывающим окном, чтобы появляться через Rails?

+0

Прогресс - Когда я пошел в «Службы» в среде Windows. В свойствах службы Mongrel есть один параметр в «Вход в систему -> Разрешить взаимодействовать с рабочим столом». Когда я проверил его и попытался запустить мой код, я получил «Обнаружение интерактивных служб». Программа, запущенная на этом компьютере, пытается отобразить сообщение [Содержание]. Программа может нуждаться в информации, форме которой вы или ваше разрешение, чтобы выполнить задачу. Почему это происходит? [V] Показать сведения о программе [Посмотреть сообщение] [Спросить меня позже] «Итак, как получить это служебное приглашение в браузере, а не в фоновом режиме? Я иду в правильном направлении? –

ответ

0

Вы изучили исправление файла win32ole.rb?

В принципе, вот причина пластыря:

t turns out that win32ole.rb patches the thread to call the windows OleInitialize() & OleUninitialize() functions around the yield to the block. However, the MS documentation for CoInitialize (which OleInitialize calls internally) state that: "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." 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

+0

Да, я видел это раньше, но не понял контекст только сейчас, когда я вошел в службы, я это понял. Значит, вы имеете в виду, что мне нужно управлять потоком с помощью этого кода. И нужно только установить это исправление на win32ole.rb и использовать его? –

+0

Я использую redmine. создал win32ole.rb и поместил в него этот код. Я поместил этот файл в папку инициализации. Я перезапустил службы Mongrel, но когда я попытался получить доступ к серверу localhost: 3000, он не отвечает. Мне нужно удалить этот журнал на настройках из службы? –

+0

Я отлаживал это в моем журнале mongrel «/config/initializers/win32ole.rb:12: undefined method« ole_initialize »для WIN32OLE: Class (NoMethodError)», и когда я еще больше в него заработал, у меня есть выяснили, что рубиновая версия [ 1.8.7], который я использую, не имеет файла win32ole.rb в самом источнике. Т.е. http://rxr.whitequark.org/mri/source/ext/win32ole/lib/win32ole.rb?v=1.8.7 –