Ruby и WIN32OLE: невозможно вызвать методы WIN32OLE_TYPE (библиотеки типов) - PullRequest
1 голос
/ 02 марта 2010

Хорошо, так что я делаю хорошую OLE '(извините) автоматизацию с ruby, и я столкнулся со странной проблемой. Я пытаюсь извлечь некоторые данные из библиотеки типов. Это работает в VB:

Dim c As New TControlsLib.LangCombo
Dim l As TControlsLib.Language
Dim converter As New TControlsLib.LcidConverter
c.AddAllSystemLanguages mtAllKnownLanguages, True
For Each l In c.Languages
  Debug.Print l.DisplayName & ";" & converter.IsoAbbreviationFromLcid(l.Lcid)
Next

TControlsLib - библиотека типов (полное название: «Библиотека типов элементов управления TRADOS»). Я также знаю, что mtAllKnownLanguages ​​- это константа, равная 3.

Итак, я попытался сделать то же самое в Ruby. Вот мой сеанс IRB:

irb(main):001:0> require 'win32ole'
=> true
irb(main):002:0> t = "TRADOS Controls Type Library"
=> "TRADOS Controls Type Library"
irb(main):003:0> c = WIN32OLE_TYPE.new(t, "LangCombo")
=> LangCombo
irb(main):004:0> converter = WIN32OLE_TYPE.new(t, "LcidConverter")
=> LcidConverter
irb(main):005:0> c.ole_methods
=> [QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, 
GetIDsOfNames, Invoke, Enabled, Enabled, Languages, Refresh, AddSystemLanguage, 
SelectedItem, SelectedItem, SelectLanguage, Clear, AddAllSystemLanguages, 
DroppedDownHeight, DroppedDownHeight, AddCustomLanguage, AddLanguage, Type, 
Type, RemoveLanguage, OnSelectionChanged]
irb(main):006:0> c.AddAllSystemLanguages(3, true)
NoMethodError: undefined method `AddAllSystemLanguages' for LangCombo:WIN32OLE_TYPE
from (irb):6

Я также не могу вызывать какие-либо другие методы. На самом деле кажется, что я не могу вызвать какие-либо методы библиотеки типов.

Что я делаю не так?

1 Ответ

2 голосов
/ 11 марта 2010

Я не уверен на 100%, но WIN32OLE_TYPE может быть только для извлечения информации. Попробуйте использовать только объект WIN32OLE. Вы должны знать имя сервера, хотя, например (я предполагаю имя сервера):

c = WIN32OLE.new('Trados.LangCombo')

И тогда у вас будет возможность вызвать напрямую:

c.AddAllSystemLanguages(3, true)

Или используйте метод invoke для WIN32OLE:

c.invoke("AddAllSystemLanguages", 3, true)
...