我正在尝试使用Ruby v1.93在COM对象中设置数组属性。将COM中的数组编组为Ruby数组只是起作用,但不是另一个方向。如何将Ruby数组编组到COM中?
该属性包含在.NET程序集中:
namespace LibForRuby
{
public class MyClass
{
public MyClass()
{
MyInt = 1;
MyArray = new[] {2, 3};
}
public int MyInt { get; set; }
public int[] MyArray { get; set; }
}
}
我的整个ruby脚本是:
require 'win32ole'
com_class = WIN32OLE.new('LibForRuby.MyClass')
puts 'Before:'
my_int = com_class.MyInt
puts my_int
my_array = com_class.MyArray
print my_array
puts
puts 'After:'
com_class.MyInt = 10
my_int = com_class.MyInt
puts my_int
com_class.MyArray = [20,30]
my_array = com_class.MyArray
print my_array
输出结果为:
C:\Ruby193\bin>test
Before:
1
[2, 3]
After:
10
C:/Ruby193/bin/test.rb:13:in `method_missing': (in setting property `MyArray': )
(WIN32OLERuntimeError)
OLE error code:0 in <Unknown>
<No Description>
HRESULT error code:0x80020005
Type mismatch.
from C:/Ruby193/bin/test.rb:13:in `<main>'
答案 0 :(得分:0)
试试这个:
puts 'After:'
com_class.MyInt = 10
my_int = com_class.MyInt
puts my_int
com_class._setproperty(
com_class.ole_method_help('MyArray').dispid,
[[20,30]],
[WIN32OLE::VARIANT::VT_ARRAY]
)
my_array = com_class.MyArray
print my_array
确保在ruby-doc.org上查找#_setproperty方法,看看为什么你的数组被包含在一个数组中,以及为什么变量常量在数组中。
答案 1 :(得分:0)
有点晚了,但我尝试设置System.Security.Cryptography.TripleDESCryptoServiceProvider
的密钥时遇到了同样的问题,因为我在没有OpenSSL
的情况下将一些加密算法实现到ruby引擎
这不起作用:
crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
crypto.key = [62,116,108,70,56,97,100,107,61,51,53,75,123,100,115,97]
这确实有效:
arr = [1,2,3,4]
crypto = WIN32OLE.new("System.Security.Cryptography.TripleDESCryptoServiceProvider")
vArr = WIN32OLE_VARIANT.array([arr.length],WIN32OLE::VARIANT::VT_UI1)
arr.each_with_index {|val,index| vArr[index]=val}
crypto.key = vArr